2015-05-12 49 views
1

我一直在做一個項目,並有好幾個班,其中一些看起來像這樣:故障參考變量/指針的類成員[C++]

class A 
{ 
    // stuff; 
}; 

class B 
{ 
    A& test; 

public: 
    B(A& _test) : 
     test(_test) 
    {}; 
    void doStuff(); 
}; 

class C 
{ 
    A foo; 
    B bar(foo); 

    void exp() 
    { 
     bar.doStuff(); 
    } 
}; 

這最終打破當C :: foo不是類型名稱時,它是C類。在我更大的項目中,所有內容都分解成單獨的.cpp和.h文件,如果我在Bh中包含「Ch」,則看不到該錯誤,但在C.cpp中仍存在錯誤,完全無法識別我的編譯器(Visual Studio 2013)。即使A &是A *,錯誤仍然存​​在(當然,將代碼從引用更改爲必要的指針)。有沒有人有任何提示這裏發生了什麼?

+0

「破」是什麼意思?編譯器錯誤?運行時錯誤?意外的結果? – wallyk

+0

B bar(foo)具有編譯器錯誤(成員「C :: foo」不是類型名稱),最終導致編譯器錯誤的項目崩潰 – Airtamis

+0

備註:您傳遞臨時副本到引用,您的B一個_test)'應該是'B(A&_test)'。 – vsoftco

回答

3

這行代碼:

B bar(foo); 

嘗試聲明命名bar成員函數返回一個B並採取foo類型的參數。但是,在您的代碼中,foo不是一種類型 - 它是一個變量。我猜你的意思是初始化bar代替:

B bar{foo}; // non-static data member initializers must be done with {}S 

或剛寫出來的構造:

C() 
: bar(foo) 
{ } 

此外,這種構造賦予您參考test到臨時_test

B(A _test) : 
    test(_test) 
{ } 

您想以_test作爲參考:

B(A& _test) : test(_test) { } 
+0

啊!這樣可行。我很習慣在創建對象時使用構造函數,謝謝。 編輯:就像我上面說過的那樣,這個測試是參考,只是一個類型從一個快速的例子輸入 – Airtamis