Оболочка C ++ с оператором overloaded = - PullRequest
1 голос
/ 04 марта 2010

Я пытаюсь разработать довольно простой (пока что) класс-оболочку для int , и надеялся перегрузить оператор = для достижения чего-то вроде следующего:

class IntWrapper
{
    ...
    private:
        int val;
}

int main ( )
{
    IntWrapper a;
    int b;

    a = 5; // uses overloaded = to implement setter
    b = a; // uses overloaded = to implement getter
}

Я понимаю, однако, что это не может быть сделано. Реализация сеттера довольно проста, что-то вроде:

class IntWrapper
{
    ...
    IntWrapper& operator = (int rhs) { this.val = rhs; return *this; }
    ...
}

Тем не менее, из небольшого количества поисков в Google, я понимаю, что нет способа сделать добытчик таким образом. Насколько я понимаю, это потому, что оператор = может быть переопределен только для присвоения переменной, а поскольку int является примитивным типом, мы не можем переопределить его реализацию по умолчанию =. Это правильно? Если нет, то как мне написать геттер?

Если это правильно, есть ли у кого-нибудь изящные предложения для чего-то подобного? Ближайшее, что я могу найти, это перегрузка оператора преобразования:

class IntWrapper
{
    ...
    operator int( ) { return this.val; }
    ...
}

int main ( )
{
    ...
    b = (int) a;
    ...
}

Мне кажется, что это кажется довольно бессмысленным, так как это едва ли лучше, чем простой метод getVal () .

Спасибо за любые предложения!

Ответы [ 2 ]

4 голосов
/ 04 марта 2010

Вам не нужно приведение, чтобы вызвать функцию преобразования. Равнина

b = a;

тоже вызовет его. Таким образом, я вижу, как это удобнее использовать, чем функцию getVal. Хотя я обычно не использую функции преобразования. Я бы предпочел явную функцию getVal. В частности, рассмотрим этот

struct W {
  W(int);
  operator int();
};

int main() {
  W w = 42;
  int a = true ? 0 : w; // Ambiguity! What conversion direction?
}

Он быстро выходит из-под контроля ...

1 голос
/ 04 марта 2010

То, что вы предлагаете, это путь, и я использую его все время. Вам не нужно приводить к int. Компилятор достаточно умен, чтобы увидеть, что b - это int, и он автоматически вызовет оператор int для оператора.

...