C ++ - перегрузка оператора присваивания для типов по умолчанию - PullRequest
0 голосов
/ 29 октября 2010

Я хочу перегрузить оператор присваивания для типов, таких как "int", "long" и т. Д. То есть я хочу использовать код, подобный:

class CX {
private:
  int data;
...
};

CX obj;
int k;
k = obj;  // k should get the value of obj.data

Очевидно, что операторы присваивания не могут быть дружественными функциями. Как мне достичь вышеуказанного?

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

Кроме того, есть одно ограничение IMP - мы НЕ МОЖЕМ использовать методы get / set, потому что: В коде выпуска у нас будет тип CX определен как int или long (как требуется), но в коде DEBUG мы хотим иметь его как класс (для автоматической проверки типов в тысячах мест). Код должен быть общим. Причина в том, что компилятор (по крайней мере, версия, которую мы используем) каким-то образом не способен оптимизировать все операции, если CX сделан классом.


Одна проблема - я не хочу, чтобы это прошло:

CX x; long p; p = x;

Я предполагаю, что приведенное ниже решение неявно выполнит код для длинных / коротких и т. Д. Тоже. (Если нет, то это именно то, что я ищу!).

В соответствующей заметке, отвечая на вопрос Дэвида - причина, по которой я хочу провести рефакторинг, - мы хотим, чтобы возможность переключения CX была 32-битной или 64-битной. Поэтому мы хотим запретить любые неявные преобразования и перехватывать их во время компиляции. Теперь наоборот - (disallowiong

CX x = some_64_bit_int;

но допускается

CX x = some_32_bit_int;

Я добился этого с помощью оператора templatized =, который по умолчанию устанавливает время компиляции, но перегружает его для нужного мне типа.


В случае, если вы считаете, что это плохой дизайн или я должен попробовать другие альтернативы - причина, по которой мне это нужно, заключается в следующем: у нас есть тысячи строк устаревшего кода, где что-то просто определено как «int» .

typedef int CX;

Есть повсюду задания, такие как:

CX x; int k; k = x;    // Writing the simplified relevant code here

Я работаю над проектом по изменению CX на класс. На первом этапе мы хотим исправить все ошибки компиляции (которые делают CX классом), внося как можно меньше изменений в код.

Ответы [ 3 ]

16 голосов
/ 29 октября 2010

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

class ABC
{
public:
    operator int() { return data; } // cast operator
private:
    int data;
...
};
1 голос
/ 29 октября 2010

Вы не можете сделать это. operator=() должен быть функцией-членом и не может быть перегружен для int. Я вижу эти возможности:

  • Положитесь на оператор неявного преобразования в вашем классе. Я бы посоветовал против этого. Я не могу вспомнить ни одного раза, когда я сделал это, где я не пожалел и удалил это позже.
  • Напишите явную функцию-член int get() const {return data;} и вызовите ее.
  • Спросите себя, почему вы хотите обернуть это int в классе, но все же хотите разрешить присваивание простому int. Это пахнет.
0 голосов
/ 29 октября 2010

Вы можете иметь CX в качестве класса и иметь функции преобразования в классе для типа int.Таким образом, ваш класс может работать таким образом

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