2009-06-06 34 views
2

我不是一個C++專家,仍然沒有很好的直觀的方式來掌握事物的工作方式。我認爲這是一個簡單的問題。我無法將對象與狀態傳遞給其他對象。我寧願避免傳遞指針或引用,因爲一旦初始化對象被設置,我就會在緊密的循環中調用它們數百萬次。我認爲我的東西就像命令模式一樣。這是問題的核心。我的頭的代碼是一樣的東西:簡單的問題:傳遞狀態的對象,C++

class ObjectWithState { 
public: 
    ObjectWithState(int state) { // This constructor creates the problem! 
    state_ = state;  // everyting works with no constructor. 
    } 
private: 
    int state_; 
}; 

class TakesObject { 
public: 
    TakesObject(ObjectWithState obj) { 
    obj_ = obj; 
    } 
private: 
    ObjectWithState obj_; 
}; 

main()功能看起來像:

int main() { 
    ObjectWithState some_object(1); 
    TakesObject takes_object(some_object); 
    return 0 
} 

我得到以下錯誤(G ++):

test.h: In constructor 'TakesObject::TakesObject(ObjectWithState)': 
test.h:14: error: no matching function for call to 'ObjectWithState::ObjectWithState()' 
test.h:5: note: candidates are: ObjectWithState::ObjectWithState(int) 
test.h:3: note:     ObjectWithState::ObjectWithState(const ObjectWithState&) 

簡單的答案?

我不確定這是否與複製構造函數有關。如果是這樣,我試圖找到一個解決方案,使ObjectWithState的類定義非常乾淨和簡短。這個庫的用戶將定義很多像TakesObject函數將使用的小函數。理想情況下,ObjectsWithState的程序員只需要關注實現一個簡單的對象。也許我誤入歧途......

回答

5

你可能想要做的就是使用成員初始化語法:

class TakesObject { 
public: 
    TakesObject(ObjectWithState obj): obj_(obj) { 
    } 
private: 
    ObjectWithState obj_; 
}; 

在你貼的代碼中,TakesObject構造函數將首先嚐試創建一個新的ObjectWithState與其默認構造函數,然後調用賦值運算符將傳入的obj複製到obj_。以上示例使用其複製構造函數直接構造obj_

您還需要定義一個拷貝構造函數爲你ObjectWithState類,太:

class ObjectWithState { 
public: 
    ObjectWithState(int state) { 
    state_ = state; 
    } 
    ObjectWithState(const ObjectWithState &rhs) { 
    state_ = rhs.state_; 
    } 
private: 
    int state_; 
}; 

如果你從你的類聲明中省略所有構造函數,那麼編譯器提供一個默認,併爲您的拷貝構造函數。如果您聲明任何構造函數,則編譯器提供默認或複製構造函數,因此您必須實現自己的構造函數。

+1

很好的答案,但他不需要聲明一個拷貝構造函數。默認的拷貝構造函數是足夠的。 – rlbond 2009-06-06 02:54:26

+0

他確實需要聲明覆制構造函數 - 一旦他聲明瞭ObjectWithState(int),默認的複製構造函數就會丟失。 – 2009-06-06 02:56:39

1

你得到這個錯誤是因爲你聲明瞭一個構造函數。只有在您沒有在類中聲明構造函數時,編譯器纔會提供默認構造函數。因爲你已經聲明瞭一個構造函數,所以你不會得到默認的構造函數。你必須顯式聲明一個沒有參數的構造函數。