在带有子类的 Class 模板中使用指针

Using pointers in Class Templates with Subclasses

我在 Class 模板中使用指针时遇到问题。如果 'vv' 存储指向向量的指针,我无法从 B 子类正确访问 vv;如果我简单地存储向量它就可以工作。但是我想做的事情需要我存储指针。老实说,我不知道我做错了什么,所以这里是代码:

template<typename T>
class A{
    public:
        std::vector<std::vector<T>*> vv;
        void add(std::vector<T> new_vec)
        {
            vv.push_back(&new_vec);
        }

        virtual void print(){}
        virtual ~A(){}
};

template<typename T>
class B : public A<T>{
    public:
        void print() override{
            std::cout << this->vv[0]->at(0) << std::endl;
        }
};

int main(){
    int i = 10;
    std::vector<int> v;
    v.push_back(i);
    
    A <int>*a = new B<int>();
    a->add(v);
    a->print();
    return 0;
}

a->print() 打印 0 而不是 10。此外,我无法更改 main() 中的内容。 如果能提供一些帮助,我将不胜感激!

这里:

    void add(std::vector<T> new_vec)
    {
        vv.push_back(&new_vec);
    }

您在 vv 中存储了一个指向局部参数 new_vec 的指针。该本地副本只会存在到方法 returns 之前。因此向量中的指针是无用的。稍后取消引用它们会调用未定义的行为。如果你真的想存储指针,你应该将指针(或引用)传递给 add。不过,您应该使用智能指针。