我來自Java背景,但是我學習了C++之後,現在已經使用它編寫了幾年(主要是調試和寫入修復,而不是從頭開始設計程序)。然而,我今天坦率地遇到了一個問題,我花了很長時間才碰到它,我有點驚訝。這是不好的RAII設計?
比方說,我有一個名爲Class其頭文件包含(除其他代碼)類:
class Class1 {
private:
Class2 object;
}
的類2類沒有指定一個默認的構造函數。現在,在Class1的構造,我讀文件的二進制頭和使用我從解析信息初始化類2,如下面的僞代碼:
Class1::Class1(std::string) {
// Read some binary info from a file here
// Parse that binary info
object2 = Class2(info);
在Java中,因爲它是不使用RAII範例,那將是完全合法的。但是,由於C++使用RAII,在我做object2 = Class2(info);
時,對象2已經用其默認構造函數初始化了。我不能只是最初調用該構造函數(在Class1頭文件中),因爲我沒有創建object
所需的信息。但是,我不能僅將object2
作爲本地構造函數,因爲我需要其他函數才能看到/使用它。
顯然這是行不通的。這個東西的標準方法是什麼?其實我想過只是改變的Class1具有像這樣一類2指針:
class Class1 {
private:
Class2* objectPointer;
}
,然後調用*objectPointer = Class2(info)
。然而,在我的情況下,「Class2」是一個ifstream,看起來operator=
函數已被刪除,並不適用於任何一種方法。
那麼......我該怎麼做?
哈哈!在<1分鐘內4個相同的答案 – Walter
我不認爲說「C++使用RAII」是完全正確的。 C++啓用RAII,但不需要使用它。 –
請注意,RAII是一個奇妙功能的可怕名稱。雖然名稱提示初始化,但重要的一面是破壞:每個資源都應該由一個類來管理。它沒有/反對2階段初始化(儘管你可能想盡可能避免它) –