2012-04-30 63 views
0

所以我已在C++類,其具有2個參考類型成員:給予缺省值來引用成員變量

class Edge{ 
private: 
const Node& base; 
const Node& target; 

public: 
    Edge(const Node& new1, const Node& new2); 

我想給默認值在C'tor到基座和目標。這意味着:

Edge() 

將不會是一個錯誤,但會創建一個Edge對象。我怎麼做?

編輯: 我也想這樣做:

Edge::Edge(const Node& newBase, const Node& newTarg) 
{ 
    m_base=newBase; 
    m_target=newTarg; 
} 

但它不會讓我,它說沒有運營商「=」匹配這個運營商。但我確實爲節點創建了一個「=」運算符,並檢查它的工作.......

+0

你嘗試過什麼?你知道如何編寫函數的默認參數嗎? –

+0

@KerrekSB:添加默認參數並沒有什麼幫助。 –

+0

這似乎是一個糟糕的主意。你想用引用成員變量做什麼? – mydogisbox

回答

5

您可以給new1new2像其他任何參數一樣使用默認值。訣竅是,因爲他們通過引用傳遞和(大概)你使用他們來設置basetarget他們需要活得足夠長,這是有道理的。你可以通過使靜態的「虛擬」 Node作爲默認尚未指定其中一個,例如:

class Node {}; 

class Edge{ 
private: 
static const Node none; 
const Node& base; 
const Node& target; 

public: 
    Edge(const Node& new1=none, const Node& new2=none) : base(new1), target(new2) {} 
}; 

const Node Edge::none; 

int main() { 
    Edge e; 
} 

如果這是很好的設計或不使用是另外一個問題,雖然。對於您正在嘗試解決的潛在問題,可能會有更明智的解決方案。

+2

+1注意到這可能是不好的設計 – mydogisbox

+0

我編輯了我的問題,並添加了一件事:現在我的正常c'tor值不工作。 – Jjang

+0

@Jjang - 這是一個稍微不同的問題,有一個很好的答案:http://stackoverflow.com/a/4589276/168175 - 基本上你需要使用initaliser列表語法,就像我在我的答案中做的那樣,無論你有沒有默認與否。 – Flexo

2

下面是對非經常提到的作品,也是一個版本:

struct Bar { /* ... */ }: 

struct Foo 
{ 
    Foo(Bar & br) : b(br)   { } 
    Foo()   : b(default_bar) { } 
private: 
    static Bar default_bar; 
    Bar & b; 
}; 
Bar Foo::default_bar; 

這樣,所有的默認構造Foo實例包含於常見的,靜態default_bar對象的引用。

+0

缺少'酒吧& b;'會員? –

+0

@BenVoigt:的確,謝謝! –

+0

編輯問題,現在甚至我的正常c'tor與值不起作用 – Jjang

0

另一種解決方案是使用的包裝是可複製

struct Reference 
    { 
    T* r_noncopyable_object; 
    };