我正在研究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