2010-10-13 76 views
0

我正在研究VC++中的类库,它应该有ref类和一些本地代码。现在,我需要使用来自外部框架的五个本地对象。这些对象必须在堆栈上的堆栈上声明。我想将这些对象封装在知道构造函数需要被调用的某种结构中。在C++中声明类中的对象的最佳做法是什么?

谢谢。

回答

0

我不知道我知道你要问什么。构造函数总是需要在对象上调用,不管它们是堆栈还是堆栈。如果你的意思是你想要某些东西来自动调用堆分配内存的析构函数,那么你可以使用std::auto_ptrboost::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对象。

+0

这提出了包含定义MyConfig的其他头文件的可爱性的问题,因为MyConfig.h可能定义其他东西或具有更多包含。 – mbadawi23 2010-10-13 12:43:55

0

那么,对于每个非托管类X,声明一个ref类XWrapper,它将私有的非托管指针存储到X,在构造函数中存储new,在析构函数中存储delete。为什么不?

0

你应该换一个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; 
    } 
} 
相关问题