Используйте класс с оператором [] - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь реализовать класс "Integer", ожидая, что он будет работать как встроенный тип int. Но у меня проблема: я не могу использовать этот класс в операторе [] как int См. Мой код ниже:

#include <iostream>
using namespace std;

class Integer
{
    private:
        int Value;

    public:
        Integer(int x = 0)
        {
            Value = x;
        }

        void SetValue(int x)
        {
            Value = x;
        }

        int GetValue()
        {
            return Value;
        }

        Integer& operator [] (Integer X);
};

Integer& Integer::operator [] (Integer X)
{
    // Code
}

int main()
{
    Integer X[10];
    Integer I(5);
    int i = 5;

    for(int i=0; i<10; ++i)
        X[i].SetValue(i+1);

    cout << X[i].GetValue() << endl;    // It still work
    cout << X[I].GetValue() << endl;    // Doesn't work

    return 0;
}

Как (исключая оператор приведения) заставить оператор [] понимать мой тип Integer так же, как и в int?

Ответы [ 4 ]

5 голосов
/ 03 мая 2019

Вы думаете об этом неправильно. Вам не нужно перегружать оператор [] в вашем собственном классе, вам действительно нужно, чтобы ваш класс был конвертируемым в int, что можно сделать, перегрузив оператор приведения.

class Integer
{
public:
  operator int () const { return Value; }
};
3 голосов
/ 03 мая 2019

Здесь немного путаницы. Объявление массива типа T имеет вид

T t[n];

где n - это вычисляемое во время компиляции константное выражение для размера массива.

Этот не вызывает ни один оператор [], определенный в T, а также последующий доступ к элементу через выражение t[i] для целочисленного типа i.

Если в вашем случае вы хотите, чтобы X[I] был компилируемым, вам нужно предоставить оператор, который позволяет I обрабатываться как индекс массива (более формально для языка требуется примитивный целочисленный тип ). Оператор приведения к int является очевидным выбором, с

operator int() const
{
    return Value;
}

является реализацией.

2 голосов
/ 03 мая 2019

Вам нужно будет добавить оператор приведения типа в ваш класс.Это позволяет вашему классу быть преобразованным в совместимый тип.См. Здесь для получения дополнительной информации: http://www.cplusplus.com/doc/tutorial/typecasting/

Эта функция должна помочь вашему классу.

operator int() const { return GetValue(); }
0 голосов
/ 03 мая 2019

На самом деле вам не нужно перегружать оператор [].Вам просто нужно убедиться, что вы можете преобразовать Integer в int с оператором int int.

Что-то вроде этого будет работать лучше.

operator int() const
{ return GetValue(); }

Тогда вам также следует быть осторожным с вашимпечатает.

X[i].GetValue() неверно, поскольку i = 10 в вашем примере.Это приведет к ошибке выполнения.

X[I].GetValue() неверно в вашем примере, потому что преобразование между вашим классом и int невозможно без I.getValue().Я удивлен, что это не приведет к ошибке компиляции, но перегрузка оператора int приведет к этой проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...