存储子类指针的方法
method storing subclass pointers
我有超类A
和子类B
和C
,
我必须在某种意义上满足某种接口,我想做这样的事情:
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>();
相关文章:
- 将一个类的方法指针存储到另一个类中
- 如何调用返回类方法指针的类方法
- 通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- C++;类方法指针;λ;将 lambda 作为成员函数指针传递;
- 使用模板、方法指针和字符串键入推导
- 将方法指针作为整数参数发送到C#的C 方法
- 从C 中的VTable获取方法指针
- 模板化方法指针 - 无法匹配函数参数的指针
- 获取特定的模板重载方法指针
- 如何将方法指针声明为Typedef方法参数
- 如何将方法指针类型转换为函数指针类型
- 如何在使用 pthreads 时将方法指针作为函数参数传递C++
- 方法指针映射,编译器说他们不接受任何参数
- C# 方法指针,如 C++ 中的指针
- c++创建新的LinkedList类:Clear()方法指针被释放未分配
- 尝试获取类方法指针时出现E_NOINTERFACE
- 传递和强制转换方法指针
- 常量方法指针的类型是什么
- 将对象的方法指针传递给接受 [静态方法指针/全局函数] 指针的函数