在C ++中声明类中对象的最佳实践是什么?

时间:2010-10-13 12:03:52

标签: c++ visual-c++

我正在使用VC ++中的类库,它将具有ref类和一些本机代码。现在,我需要使用外部框架中的五个本机对象。必须在不在堆栈上的堆上声明这些对象。我希望将这些对象封装在某种结构中,因为知道需要调用构造函数。

谢谢。

3 个答案:

答案 0 :(得分:0)

好吧,对于每个非托管类X,声明一个ref类XWrapper,它私有地存储非X的非托管指针,构造函数中的new,以及析构函数中的delete。为什么不呢?

答案 1 :(得分: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; }
}

你也可以使用pheonix方法:

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;
   }
}

答案 2 :(得分: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中的完整声明。你可以这样做b / c你不需要知道MyConfig对象的大小来构造类X,因为它只包含一个大小相同的引用,而不管底层对象是什么。这样做有助于依赖,也可以减少编译时间。

另一方面,如果私有成员配置更改为const MyConfig x;,则必须在Xh中包含MyConfig.h头,因为构造类X需要知道要分配多少内存来存储MyConfig对象