Итак, у меня есть базовый класс, который имеет закрытый член и производный класс, который также имеет некоторый член, базовый класс определяет оператор =, и это мои вопросы:
Это правильный способ сделать это или есть лучший способ?
Я делаю какие-либо нарезки по пути?
class A
{
private:
int* Arr;
public:
A(){
Arr=new int[10];
for(int i=0;i<10;i++){
Arr[i]=2*i;
}
}
const A& operator=(const A& a){
delete []Arr;
Arr=new int[10];
for(int i=0;i<10;i++){
Arr[i]=a.Arr[i];
}
return *this;
}
};
class B: public A
{
private:
int * Arr2;
public:
B(){
Arr2=new int[10];
for(int i=0;i<10;i++){
Arr2[i]=3*i;
}
}
const B& operator=(const B& b){
A::operator=(b);
delete []Arr2;
Arr2=new int[10];
for(int i=0;i<10;i++){
Arr2[i]=b.Arr2[i];
}
return *this;
}
};
Я знаю, что это не идеальный код, но я просто написал простой вопрос.
После долгих исследований я пришел к следующим выводам:
При этом использование оператора присваивания базового класса будет работать правильно
A::operator=(b)
Код по-прежнему должен обеспечивать надлежащую исключительную безопасность, безопасную при назначении
гарантия, как указано в комментариях.
Более того, поскольку нам нужно реализовать оператор присваивания, который также означает правило трех нам нужно будет реализовать конструктор копирования и, как уже упоминалось Вот это приведет к ненужному дублированию кода.
Итак, как мы решаем все эти проблемы (и, возможно, еще несколько ..)?
Лучшее, что я нашел, это использовать Копирование и своп-Idiom. Я считаю, что никаких дальнейших объяснений не требуется, кроме того, что приведено в этом посте.
То, что ты хочешь не иерархия классов. Невозможно назначить базовый объект, чтобы получить свойства производного объекта. Базовый объект всегда будет оставаться базовым объектом. Если вы хотите иметь полиморфное поведение, но сохраняете семантику разумных значений, инкапсулируйте полиморфизм в неполиморфный класс:
class A_impl;
class A {
public:
//Public interface:
//...
private:
//Assuming `value_ptr` similar to
//https://bitbucket.org/martinhofernandes/wheels/src/17aee21522ce8d07c7a74b138e528fadf04d62ed/include/wheels/smart_ptr/value_ptr.h%2B%2B?at=default
value_ptr<A_impl> impl;
};class A_impl {
public:
//Implementation interface:
//virtual ...
//virtual ~A_impl() {}
};
class B : public A_impl {
public:
//Implementation:
//...
};
Вы должны написать оператор копирования.