оператор присваивания c ++ NULL присваивание - PullRequest
0 голосов
/ 12 марта 2012

Я работаю с классом, который в основном работает нормально, но я делаю некоторые функции, которые могут иметь рекурсивную функцию, возвращающую указатель NULL типа класса в качестве элемента управления, и поэтому он может назначать NULL указатель на мой объект класса, если коротко:

Thing& Thing::operator=(Thing * _other){
    if (_other == NULL){
        *this = NULL;        // compiler throws here
        return *this;    
    }
    // does other assignment work
    return *this;
}

мой компилятор VS2010 выбрасывает, что this не является I-значением. так как мне установить значение NULL, или вообще возможно установить элемент в NULL изнутри?

EDIT: изменено с this на *this, хотя по какой-то причине теперь программа прерывается бесконечными вызовами оператора присваивания. понятия не имею, что происходит

Ответы [ 5 ]

2 голосов
/ 12 марта 2012

Вы пытаетесь написать «обнуляемый» класс.Считайте, что «нулевое» состояние является одним из состояний, в которых может находиться экземпляр Thing, и не сверните его с семантикой указателя.

Общий метод заключается в добавлении логического флага в ваш классотслеживает, находится ли экземпляр в нулевом состоянии или нет.Я бы реализовал это так:

class Thing
{
private:
    bool m_null;

public:
    void setnull() { m_null = true; }
    bool isnull() const { return m_null; }

    Thing() : m_null(true) {}

    ... // rest of class
};

И теперь оператор присваивания по умолчанию работает нормально.

2 голосов
/ 12 марта 2012

Вы не можете напрямую установить значение для указателя this. Отсюда

this = NULL;

семантически и синтаксически неверен.

Вы можете использовать исключения, чтобы проверить, является ли _other NULL. Например:

class null_object_exception : public virtual exception {};
...
if (_other == NULL) throw null_object_exception();

Для выполнения задания NULL:

Thing the_thing, other_thing;
try { the_thing = &other_thing; }
catch( const null_object_exception& e ) { the_thing = NULL; }
1 голос
/ 12 марта 2012

Короткий ответ, нет, вы не можете присвоить this в C ++.

Более длинный ответ;чтобы ваш оператор присваивания даже был вызван, вы должны иметь такую ​​конструкцию:

MyObject a;
a = NULL;    // can change the content of `a` but not which object the name `a` refers to.

Если вы думаете об этой конструкции;

MyObject *a;
a = NULL;

ваш оператор присваивания выигралдаже не вызывается, поскольку это оператор объекта , а не указатель .Присвоение указателю a будет работать без определения оператора присваивания.

1 голос
/ 12 марта 2012

Какие переменные-члены класса Thing?если вы хотите показать, что объект каким-то образом не имеет значения или не инициализирован, вам лучше назначить поля 0 (для целых чисел) и ноль (для указателей) и т. д. вместо того, чтобы назначать «this», которое является константой.

1 голос
/ 12 марта 2012

Вы НЕ МОЖЕТЕ назначить на this.

Кроме того, вы должны взять свои аргументы по ссылке const, так что Thing& operator= (const Thing& other)

Есть отличный SOвопрос в C ++ - faq тэг о перегрузке операторов, вы можете найти его здесь

...