我无法想象这个的一个原因......这是我的基类
class TextureElement
{
public:
TextureElement(std::wstring mname);
std::wstring file;
std::wstring name;
TexMode texmode;
};
这是一个基本用法:
TextureElement* textureElement = new TextureElement(prename);
mClass->textures.push_back(textureElement);
textureElement->file = path;//<<here crashes if inheritance is done
显然prename和path是wstrings,mstruct mClass包含几个向量,包括这个存储TextureElement * type
的向量这可以正常但是如果我从Element继承TextureElement
class Element
{
public:
Element(std::wstring mname, ElementType t);
Element(){};
~Element();
ElementType type;
std::wstring name;
};
它崩溃了。
我尝试过为TextureElement实现复制方法(我几乎可以肯定这是不必要的),但它没有用。 有什么想法吗?提前谢谢
答案 0 :(得分:3)
如果您继承自Element
,则可能需要声明 virtual
析构函数以进行正确清理:
virtual ~Element() {}
此外,在std::vector
中添加原始拥有指针时请注意。考虑使用智能指针的向量,例如vector<unique_ptr<T>>
或vector<shared_ptr<T>>
。
修改强>
此代码编译得很好并且似乎有效(在VS2015上使用Update 3测试):
#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;
enum class ElementType
{
Texture,
Foo,
Bar
};
class Element
{
public:
Element(const wstring& name, ElementType type)
: Name(name), Type(type)
{}
virtual ~Element() {}
ElementType Type;
wstring Name;
};
class TextureElement : public Element
{
public:
explicit TextureElement(const wstring &name)
: Element(name, ElementType::Texture)
{}
wstring File;
};
int main()
{
vector<shared_ptr<Element>> v;
auto p = make_shared<TextureElement>(L"Test");
v.push_back(p);
p->File = L"C:\\Some\\File";
wcout << p->File;
}