我正在研究VC++中的类库,它应该有ref类和一些本地代码。现在,我需要使用来自外部框架的五个本地对象。这些对象必须在堆栈上的堆栈上声明。我想将这些对象封装在知道构造函数需要被调用的某种结构中。在C++中声明类中的对象的最佳做法是什么?
谢谢。
我正在研究VC++中的类库,它应该有ref类和一些本地代码。现在,我需要使用来自外部框架的五个本地对象。这些对象必须在堆栈上的堆栈上声明。我想将这些对象封装在知道构造函数需要被调用的某种结构中。在C++中声明类中的对象的最佳做法是什么?
谢谢。
我不知道我知道你要问什么。构造函数总是需要在对象上调用,不管它们是堆栈还是堆栈。如果你的意思是你想要某些东西来自动调用堆分配内存的析构函数,那么你可以使用std::auto_ptr或boost::shared_ptr。请注意,这些并不等同,请阅读文档!自动指针不能在标准容器中使用,因为它们没有必要的复制语义,而boost :: shared_ptr可以在复制时对引用进行计数。
要回答您关于声明最佳实践的更一般问题,您只想完全声明您需要的对象并在您可以时转发声明。例如,如果你有一个类,如:
// In X.h
class MyConfig;
class X
{
X(const MyConfig &config);
private:
const MyConfig &config;
};
// In X.cpp
#include "MyConfig.h"
X::X(const MyConfig &config) : config(config)
{
}
在这里你不需要的X.h头文件中包含的MyConfig.h完整的声明。你可以做到这一点,你不需要知道MyConfig对象的大小来构造类X,因为它只包含一个大小相同的引用,而不管底层对象是什么。这样做将有助于依赖关系,并且还会减少编译时间。
另一方面,如果私有成员配置更改为const MyConfig x;
那么您将不得不在X.h中包含MyConfig.h头,因为构造类X需要知道要分配多少内存来存储MyConfig对象。
那么,对于每个非托管类X,声明一个ref类XWrapper,它将私有的非托管指针存储到X,在构造函数中存储new,在析构函数中存储delete。为什么不?
你应该换一个shared_ptr
这样的:
template <class T>
class my_object_wrapper
{
boost::shared_ptr<T> ptr; // or std::tr1::shared_ptr<T> if available
public:
my_object_wrapper()
: ptr(new T)
{
}
boost::shared_ptr<T> ptr() const { return ptr; }
}
你也可以用凤凰方法:
template <class T>
class my_object_wrapper
{
boost::shared_ptr<T> ptr; // or std::tr1::shared_ptr<T> if available
public:
my_object_wrapper()
{
}
boost::shared_ptr<T> ptr()
{
if (ptr == null)
ptr = new T;
return ptr;
}
}
这提出了包含定义MyConfig的其他头文件的可爱性的问题,因为MyConfig.h可能定义其他东西或具有更多包含。 – mbadawi23 2010-10-13 12:43:55