2010-10-13 41 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; 
    } 
} 
相關問題