我正在使用VC ++中的类库,它将具有ref类和一些本机代码。现在,我需要使用外部框架中的五个本机对象。必须在不在堆栈上的堆上声明这些对象。我希望将这些对象封装在某种结构中,因为知道需要调用构造函数。
谢谢。
答案 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_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中的完整声明。你可以这样做b / c你不需要知道MyConfig对象的大小来构造类X,因为它只包含一个大小相同的引用,而不管底层对象是什么。这样做有助于依赖,也可以减少编译时间。
另一方面,如果私有成员配置更改为const MyConfig x;
,则必须在Xh中包含MyConfig.h头,因为构造类X需要知道要分配多少内存来存储MyConfig对象