存储子类指针的方法

method storing subclass pointers

本文关键字:方法 指针 子类 存储      更新时间:2023-10-16

我有超类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’

这里有什么问题?

您正在构建临时对象,这些对象不能分配给非常量引用。您必须将参数改为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>();