Вопрос по использованию этого указателя - PullRequest
1 голос
/ 22 августа 2011

Я попытался скопировать указатель на другой, используя метод внутри класса и указатель this следующим образом.Я даю весь тестовый код, чтобы было понятно, что происходит.

class test  {
private:
    int x;
public:
    void setx(int x);
    int getx(void);
    void copy(test *temp);
};

void test::setx(int x)  {
    this->x = x;
}

int test::getx(void)    {
    return this->x;
}

void test::copy(test *temp) {
    this = temp;
}

И я получаю доступ к этому методу из основного, как показано ниже:следующая ошибка

In member function ‘void test::copy(test*)’:
error: lvalue required as left operand of assignment

Все остальные методы, включающие указатель this, работают нормально, кроме копирующей части.Я делаю элементарную ошибку при использовании указателя this?

Ответы [ 3 ]

7 голосов
/ 22 августа 2011

Вы не можете перезаписать this.Указатель this является константой, поэтому вы не можете его изменить.И что бы это все равно значило?Вы не можете изменить объект, в котором находитесь. Вы можете изменить значения внутри этого объекта, но не сам объект.

Вам необходимо копировать другие объекты по значению (по тому, что хранится в объекте), а не по указателю.

Кроме того, у вас не должно быть функции с именем copy;для этого нужны конструкторы копирования и операторы копирования.

2 голосов
/ 22 августа 2011

Вы не можете изменить указатель this.Однако вы можете изменить *this:

void test::copy(test *temp)
{
    *this = *temp;
}

Кроме того, вы должны переименовать элемент данных или параметр, чтобы вам не нужно было this->:

class test
{
int m_x;
public:
void setx(int x)
{
    m_x = x;
}
1 голос
/ 22 августа 2011

что должен делать test :: copy?Очевидно, что вы не можете назначить другой адрес вашему текущему объекту.Так что это неверно.

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

void test::copy(test *temp) {
    this->x = temp->getX();
}
...