我是一个Objective-C程序员,我最近开始C++,和我偶然到这个问题,在我的代码的组织:C++对象保留?
std::list<char *> stuff = std::list<char *>();
thing *object = new thing(stuff);
凡stuff
将是我需要的对象我的班级生活(也就是说,直到它被破坏),如何避免失去它?
在Objective-C上,我可以简单地在构造函数上调用-retain
。在C++?
我是一个Objective-C程序员,我最近开始C++,和我偶然到这个问题,在我的代码的组织:C++对象保留?
std::list<char *> stuff = std::list<char *>();
thing *object = new thing(stuff);
凡stuff
将是我需要的对象我的班级生活(也就是说,直到它被破坏),如何避免失去它?
在Objective-C上,我可以简单地在构造函数上调用-retain
。在C++?
,当你不需要他们不使用指针,并don't use owning raw pointers(除非你有一个非常好原因他们)。
使用自动存储时间:
std::list<char> stuff;
thing object{stuff};
的thing
构造将采取std::list<char>
作为它的参数:
#include <utility> // for std::move
class thing {
public:
explicit thing(std::list<char> stuff_) : stuff(std::move(stuff_)) {}
private:
std::list<char> stuff;
};
如果你做这样的thing
析构函数会被调用当thing
超出范围时,隐式调用stuff
的析构函数。许多good C++ books详细解释了这一点。
与Objective-C不同,C++使用RAII而不是引用计数。基本规则是:尽可能使用自动存储持续时间,避免原始拥有指针,除非您有充足的理由,否则不要使用new
。
值得一提的是,这只会使用C++ 11编译器编译,在GCC上您需要使用'g ++ -std = C++ 0x' – jozefg
或者如果其他人需要访问同一个列表,并让事物类引用列表而不是移动它。就目前而言,移动一个新构建的对象是没有意义的。 –
通常的方法是在thing
构造函数stuff
复制或移动到thing
:
class thing {
public:
thing(std::list<char*> stuff) : stuff(std::move(stuff)) {}
private:
std::list<char *> stuff;
};
目前尚不清楚你将如何在你的榜样使用stuff
,所以我要给你有几个不同的选择。
thing
存储自己的副本stuff
。
在这种情况下,您的班级存储std::list<char*>
类型的对象。
class thing
{
public:
thing(std::list<char*>& aList):m_list(alist){}
std::list<char*> m_list;
};
当你构建的stuff
thing
副本并储存在类。当物体被破坏时,它会自动释放m_list
。
thing
存储对stuff
的弱引用。
你的课程将存储一个指针(std::list<char*>* m_list
)或引用(std::list<char*>& m_list
)。 thing
将能够以任何方式使用您的列表,但它不应该负责资源管理。如果列表的范围小于thing
,那么您将留下悬挂参考。
thing getThing()
{
std::list<char*> list1;
thing object1(list1);
return object1; //bad - list will be deallocated, object1 will have a hanging reference
}
thing
存储共享指针stuff
。 这是目标C中最像retain
的方法。C++没有自动引用计数。如果要存储具有共享所有权的对象引用,则可以使用std::shared_ptr
。 thing
店std::shared_ptr<std::list<char*>> m_list
。
std::shared_ptr<std::list<char*>> stuff = std::make_shared<std::list<char*>>();
thing object(stuff); //reference count incremented, even if stuff is destroyed object will still hold a valid reference
如果'stuff'应该完全一样长住为'object'它也许,它应该是在对象,只是让RAII采取其生命周期的服务。哦,ps,'new anthing'几乎总是邪恶的,所以要小心 – jozefg
'thing'不会被销毁,除非你明确地删除它。我会推荐学习基础知识,以获得一个好的[C++书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –
你会如何让“东西”淡出现状?你的意思是你在一个函数里面创建它吗? – Rubens