C ++:类的赋值运算符,带有指向抽象基类的动态数组指针

时间:2017-02-19 16:24:55

标签: c++ operator-overloading abstract-class

所以我有一个带有2个派生类的抽象基础,以及一个带有A** arr;的容器;现在,我想重载赋值运算符,但执行arr[i] = new A(other.arr[i]);显然不起作用。我该如何解决这个问题?我是否需要使用dynamic_cast或其他内容,还是有更“优雅”的解决方案?

class A {
private:
    int someMember;
public:
    virtual void someMethod() = 0;
    A();
    ~A();
};

class B : public A
{
private:
    int someOtherMember;
public:
    virtual void someMethod(){}
    B();
    ~B();
};

class C : public A
{
private:
    int anotherMember;
public:
    virtual void someMethod(){
    C();
    ~C();
};

class Container
{
private:
    A** arr;
    int arrSize;
public:
    Container();
    ~Container();

    //How do I implement this?
    Container& operator=(Container& other);
};

Container & Container::operator=(Container & other)
{
    //Clear current array
    for (int i = 0; i < arrSize; i++)
    {
        delete arr[i];
    }
    delete[] arr;

    //create new array
    this->arr = new A*[other.arrSize];

    //fill new array
    for (int i = 0; i < other.arrSize; i++)
    {
        //doesnt work, since A is abstract base class
        arr[i] = new A(other.arr[i]);
    }
}

不允许使用向量,因为这是学校的作业(老师明确表示没有std::vector

2 个答案:

答案 0 :(得分:1)

clone添加A虚函数,该函数返回具体对象的副本A*。在Container:: operator=内调用此方法以多态方式复制对象。

答案 1 :(得分:1)

嗯,RTTI不是我在生产代码中使用的东西,但在这种情况下它应该没问题。你可以这样做:

A* ref = other.arr[i];
if(typeid(ref) == typeid(B*))
    arr[i] = new B(*dynamic_cast<B*>(ref));
else if(typeid(ref) == typeid(C*))
    arr[i] = new C(*dynamic_cast<C*>(ref));
else
    //handle error or change else if to else

当然,这要求BC定义了复制构造函数,并从A实现了纯虚函数。你也应该将析构函数设为虚拟。