在带有子类的 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
。不过,您应该使用智能指针。
我在 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
。不过,您应该使用智能指针。