存储子类指针的方法

时间:2016-05-04 01:37:13

标签: c++ polymorphism

我有超类A和子类BC

我必须满足某种界面的某种意义,我想做这样的事情:

x.Add(B());

x.Add(C());

或A的任何其他子类。 其中B()C()是默认的构造者 我的Add方法如下所示:

Add(A & data){
vector<A*> vec;
vec.push_back(new A())
}`

它给我一个错误invalid initialization of non-const reference of type ‘A&’ from an rvalue of type ‘A’

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

您正在构建临时对象,但不能将其分配给非const引用。您必须将参数改为const引用:

class MyClass
{
public:
    void Add(const A &data);

private:
    std::vector<A*> vec;
};

void MyClass::Add(const A &data)
{
    vec.push_back(&data);
}

MyClass x;
x.Add(B());
x.Add(C());

但是存储指向临时对象的指针并没有多大意义,因为它们会被破坏,导致向量保持无效指针。

因此,一个选项是推送调用者分配的指针:

class MyClass
{
public:
    void Add(A *data);

private:
    std::vector<A*> vec;
};

void MyClass::Add(A *data)
{
    vec.push_back(data);
}

MyClass x;
x.Add(new B);
x.Add(new C);

但如果vec.push_back()失败,那可能会导致内存泄漏。

另一个选择是让Add()本身在内部执行分配,如果出现问题则释放它:

class MyClass
{
public:
    template <typename T>
    void Add()
    {
        std::auto_ptr<T> data(new T);
        vec.push_back(data.get());
        data.release();
    }

private:
    std::vector<A*> vec;
};

MyClass x;
x.Add<B>();
x.Add<C>();