0

我得到提示,对于具有作为指针的成员变量的类,我需要注意在分配时正确地对它们进行内存管理。以下方法旨在避免内存泄漏:

class SomeClass {

SomeClass& SomeClass::operator =(SomeClass& from) {
    // clone
    if (&from != this) {
        this->dispose();
        this->clone(from);
    }
    return *this;
}

void SomeClass::clone(const SomeClass& from) {
    this->array = from.array;
}

void SomeClass::dispose() {
    delete[] this->array;
}
};

假设到目前为止这是正确的,是否可以执行以下操作:

定义一个超类Object,它实现operator=并具有抽象方法clonedispose. 任何具有指针成员的类都应该Object作为超类,以便它继承operator=,并提醒我需要实现cloneand dispose

  • 这样的超类会是什么样子?
  • 通过继承来做到这一点是个好主意吗?
4

1 回答 1

2

不!不要这样做。

首先,声明你operator=()

SomeClass& SomeClass::operator =(const SomeClass& from);

注意const。在新的 C++11 标准中,还有另一种形式,它允许您在示例中显示的移动语义,但随后您将赋值运算符声明为

SomeClass& SomeClass::operator =(SomeClass&& from);

注意&&

有关此主题的深入讨论,请查找规则三或 C++11规则五

现在对于您的问题,赋值运算符不是继承的。当您没有在派生类中定义赋值运算符时,编译器将生成一个默认值并隐藏基类的赋值运算符。因此,您的基类的赋值运算符将永远不会被派生类的客户看到和使用。

有关赋值运算符的更多讨论,请参见例如What is the copy-and-swap idiom?.

于 2012-12-04T15:51:32.220 回答