c++将对纯虚拟类的引用存储为类的成员
c++ store a reference to a pure virtual class as member of class
我有一个模板化包装器,其中包含一个继承纯虚拟类的类的实例
我的问题是如何将数据存储在包装器中
-我不能使用副本,因为纯虚拟类不能实例化(如果我使用简单的虚拟类,则不能切片)
-我没能保留一份推荐信。这个ref变为无效,因为我没有管理我得到的对象的分配(超出范围)
-我唯一的解决方案是使用指针,即使我想避免这种情况,因为这不是真正安全的,我需要我的代码是健壮的
我能做什么?
这里有一个模拟我的问题的小例子:
#include <iostream>
#include <string>
#include <ctime>
#include <cmath>
using namespace std;
class Module
{
public:
Module() : m(rand())
{
cout << "m = " << m << endl;
}
virtual void f() = 0;
int m;
};
class ModuleA : public Module
{
public:
ModuleA() : ma(rand())
{
cout << "ma = " << ma << endl;
}
void f() {}
int ma;
};
template<typename T>
class Container
{
public:
Container(T e) : element(e) {}
T element;
};
// Objects are created outside of main
ModuleA createModule()
{
return ModuleA();
}
Container<Module&> createContainer()
{
return Container<Module&>(createModule());
}
int main()
{
srand((unsigned int)time(NULL));
Container<Module&> conta = createContainer();
ModuleA& ca1 = dynamic_cast<ModuleA&>(conta.element); // wrong !
system("pause");
return 0;
}
您可以在容器中使用std::shared_ptr
,即
template<typename T>
class Container
{
public:
// The pointer you get must be managed as well
Container(std::shared_ptr<T> e) : element(e) {}
std::shared_ptr<T> element;
};
那将是完全安全的。事实上,如果对象超出了创建它的代码的范围,那么在容器超出范围之前,您仍然有一个有效的指针。如果std::shared_ptr
的语义不完全适合您的情况,您可以进一步调整std::weak_ptr
或std::unique_ptr
的内存所有权关系。
你一定应该研究std::weak_ptr
,因为它允许你禁止某些代码拥有指针的所有权,但如果指针在你需要访问它的位置有效,它仍然允许访问。它还防止内存保留周期,因为std::weak_ptr
不拥有内存。
相关文章:
- 访问存储在向量C++中的结构的多态成员
- 如何创建存储指向成员函数的指针的类 (C++)
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- 使用成员函数和存储值定义书籍类
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 通过放置 new 重用数据成员存储
- 如何将提升正常分发存储为类成员
- C++:将未知类型的对象存储为成员变量的类
- structtm是否将时区信息存储为其数据成员
- 是否值得使用位移在单个字节中存储多个小数据成员?
- 将列表迭代器存储为成员
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 流的奇怪问题.不能存储具有特定值的成员变量的对象
- 不从成员函数C 存储返回值认为不良习惯
- 在数据结构中存储成员函数
- 如何通过接口存储成员函数指针
- 存储成员指针与成员值
- 存储成员函数的位置
- GCC如何在内存中存储成员函数