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

C++在类中声明对象的最佳实践是什么?,c++,visual-c++,C++,Visual C++,我正在用VC++开发一个类库,它应该有ref类和一些本机代码。现在,我需要使用外部框架中的五个本机对象。这些对象必须在堆上而不是堆栈上声明。我想将这些对象封装在某种结构中,知道需要调用构造函数 多谢各位 对于每个非托管类X,声明一个ref类XWrapper,该类私有地存储指向X的非托管指针、构造函数中的new和析构函数中的delete。为什么不呢?您应该像这样包装一个共享的ptr: template <class T> class my_object_wrapper { boos

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


多谢各位

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

您应该像这样包装一个共享的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;
   }
}

我不确定我确切知道你在问什么。构造函数总是需要在对象上被调用,无论它们是在堆上还是在堆栈上。如果您的意思是希望某些东西自动调用堆分配内存的析构函数,那么您可以使用或。请注意,这些不是等效的,因此请阅读文档!自动指针不能在标准容器中使用,因为它们没有必要的复制语义,而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;然后,您必须在X.h中包含MyConfig.h头文件,因为构造类X需要知道要分配多少内存来存储MyConfig对象。

这就提出了一个问题,即考虑到MyConfig.h可能定义其他内容或包含更多内容,是否可能包含定义MyConfig的其他头文件。