Странная ошибка нарушения доступа

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

class A
{
protected:
int x;
public:
A(){};
~A(){};
A* operator=(const A* other)
{
this->x = other->x;
return this;
}
};
class B : public A
{
public:
B() : A(){};
~B(){};
};
class C
{
protected:
A *a;
public:
C(const A* other){ *(this->a) = other; };
};

int main()
{
B *b = new B();
C *c = new C(b);
return 0;
}

Это приводит к ошибке времени выполнения в выражении ‘this-> x = other-> x;’.
Как насчет этого?

2

Решение

Мне нравится ответ Лучиана, но в вашем коде все еще есть места, которые можно улучшить, но вы можете столкнуться с неопределенным поведением в вашем коде, прежде чем исправлять другие потенциальные ошибки.

class A
{
protected:
int x;
public:
A():x(0){}     // should always initialize x in constructor
virtual ~A()=0 {} // as A is a base case, ~A must be virtual
A& operator=(const A& other)  // a reference will be more practical better?
{
this->x = other.x;
return *this;
}
};

Если вы не хотите делать объект B также, что означает, что B обслуживается как базовый класс, вы должны также сделать его деструктор виртуальным, даже сделать его чисто виртуальным.

class B : public A
{
public:
B() : A(){}
virtual ~B(){} =0
{ }
};

*(this->a) = other; уже ответил Лучиан. В вашем коде, если вы хотите сохранить копию указателя, который указывает на A, вы можете просто инициализировать a_ptr в member initialize list
см. ниже демонстрационный код:

class C
{
protected:
A *a_ptr;
public:
C(A* other):a_ptr(other){ }
};

Наконец, перейдите к вашей основной функции, если b, c используются только в основной функции, когда программа завершится, система будет требовать динамически выделенную память обратно, но если вы используете a,b в цикле, вам нужно удалить их вручную.

2

Другие решения

*(this->a) неопределенное поведение, потому что this->a не был инициализирован — это просто свисающий указатель.

Ты можешь использовать a = new A; *a = other ( this-> в данном случае это избыточно), но это не правильный путь C ++ — вы должны использовать RAII (посмотрите) — вам не понадобятся деструкторы, операторы присваивания или конструкторы копирования, если вы это сделали.

Также, operator = обычно возвращается *this по ссылке.

7

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector