我读了其他问题试图解决这个问题,但我没有找到与我的想法相似的东西。我是C ++的新手,我不想让我的C ++代码看起来像是" C与类",或者换句话说,如果有一个好的" ; C ++这样做的方式",这就是我正在寻找的东西,但我有点困惑。好吧,问题。
我有一节课,说MyClass
。现在,在其他课程中,比如MyContainer
,我有vector<MyClass> vec
。
我们现在说我正在创建一个方法,用任意内容填充MyClass
个对象,然后将其推送到vec
。第一个问题是:我应该分配和推送对象如下? (使用vector<MyClass> vec
)
MyClass *obj = new MyClass(args);
vec.push_back(*obj);
我不确定这是对的,但根据我的理解,这可以让我避免在MyClass
的实例时手动删除vec
的{{1}}的每个实例没用了。
对我来说有什么不好的是,就像我说的那样,这似乎并不正确,而我能想出的另一种方式是声明MyContainer
并写作:
vector<MyClass*>
但这会让我写一个方法来删除我之前创建的MyClass *obj = new MyClass(args);
vec.push_back(obj);
的每个实例,对吗?
那么......我应该使用什么,如果两者实际上是正确的,那么当一个人更喜欢另一个时呢?
但是,如果从一开始就出现问题,我该怎么做?
谢谢你!
PS:顺便说一句,{(1}}是在main()中创建的。我计划使用堆分配。我应该吗?
编辑:我无法使用C ++ 11。
PS2:这是作业的一部分,但我发现它足以让任何人使用,而不仅仅是我。
答案 0 :(得分:4)
你可能不应该使用new,除非你需要让对象超出变量的局部范围。
只需在堆栈中声明它:
MyClass obj(args);
vec.push_back(obj);
在C ++ 11中,您可以使用以下命令避免额外的obj副本的风险:
vec.emplace_back(args);
答案 1 :(得分:4)
是否应该按照@happydave的建议在堆或堆栈上进行分配,这在很大程度上取决于&#34; MyClass&#34;,IMO的性质。如果你需要任何类型的多态行为(即你可能有MyClass的专门子类),那么你应该有一个指针容器。
如果您担心需要单独删除每个条目,有两件事可能会对您有所帮助:
1。使用shared_ptr。所以你的代码可能如下所示:
typedef std::shared_ptr<MyClass> MyClassPtr;
...
vector<MyClassPtr> vec;
vec.push_back(MyClassPtr(new MyClass());
当没有更多的引用时,智能指针会自动删除MyClass。
2。如果你使用裸指针,你仍然可以使用std :: for_each删除所有带有一行代码的指针。这在此处描述:Can I call `delete` on a vector of pointers in C++ via for_each <algorithm>?
如果您不需要多态行为并且您的类是可复制的(要么您给它一个复制构造函数,要么默认副本适合您的实现),那么您可以在堆栈上进行分配。