2011-12-11 38 views
0

我有一個引用的類測試默認構造函數。爲什麼通過指針完成引用中斷

class test { 
public: 
    test(int &input1) : int_test(input1) {}; 
    ~test() {}; 

    int & int_test; 
}; 

然後加入2-多個類,其與測試相互作用如下:

class notebook 
{ 
public: 
    notebook() {}; 
    ~notebook() {}; 

    int int_notebook; 
}; 

class factory 
{ 
public: 
    factory() {}; 
    ~factory(){}; 

    notebook *p_notebook; 
}; 

如果我的整數intitalise試驗(T2),該按預期方式工作:

int _tmain(int argc, _TCHAR* argv[]){ 

    int var=90; 
    test t2(var); 
    cout<<t2.int_test; // this gives 90 
    var=30; 
    cout<<t2.int_test; // this gives 30 

一旦我用指向筆記本成員的指針通過第三級工廠初始化測試類:

factory f1; 
notebook s1; 
notebook s2; 
s1.int_notebook=10; 
s2.int_notebook=2; 

int notebook::*p_notebook= &notebook::int_notebook; 
f1.p_notebook=&s1; 

test t1(((f1.p_notebook->*p_notebook))); 
cout<<t1.int_test; // This gives 10 

但是,如果我將f1.p_notebook的指針更改爲筆記本s2的另一個對象;

f1.p_notebook=&s2; 
cout<<t1.int_test; // This gives 10 

t1(t1.int_test)的引用成員不反映指針的變化。有人向我解釋爲什麼?或者我在這裏做錯了什麼。

+4

對不起,但...什麼?這是一團糟。請製作乾淨整潔的小型測試用具。 –

+0

我重新提交了一個更簡單的代碼! –

+1

即使格式正確,那也不是很好的代碼。應該向你提供一些不理想的東西。 – ssube

回答

0
class CTester 
{ 
    public: 
     CTester(int &input1) : int_test(input1) 
     { 
      std::cout << int_test << std::endl; 
     } 
     int &int_test; 
}; 

class notebook 
{ 
    public: 
     int int_notebook; 
}; 

class factory 
{ 
    public: 
     notebook *p_notebook; 
}; 

int main() 
{ 
    factory f1; 
    notebook s1; 
    notebook s2; 
    s1.int_notebook=10; 
    s2.int_notebook=2; 

    int notebook::*p_notebook = &notebook::int_notebook; 
    f1.p_notebook=&s1; 
    CTester t1(f1.p_notebook->*p_notebook); 
    f1.p_notebook=&s2; 
    CTester t2(f1.p_notebook->*p_notebook); 

    return 0; 
} 

此打印

10 
2 
+0

這不是我所追求的。類測試器的構造函數是int_tester的引用。如果我理解正確,我不需要重新初始化默認構造函數兩次,以將int_test的值從10更改爲2,如果我使用整數而不是整數指針啓動的​​。例如。 int var = 90; test t2(var); VAR = 30;在這種情況下t2。int_test會給2,但是當我用一個指向整數的指針啓動構造函數時,情況並非如此。 –

+0

否。在構造函數調用時,f1.p_notebook - > * p_notebook表達式將被評估爲&s1.int_notebook,並且該指針將被傳遞給構造函數 –

+0

,但構造函數被傳遞給作爲引用的&int_test。那麼爲什麼它在第一個例子中工作,在第二個例子中失敗!請在上面再看一下,因爲我添加了代碼以查看我在說什麼。 –

0

test類有一個int的引用。它不知道int實際屬於哪個對象。或者它最初如何訪問該int。讓我們打破這行代碼:

test t1(((f1.p_notebook->*p_notebook))); 

第一本:

f1.p_notebook 

由於該行的,它是S1的指針。現在這個:

f1.p_notebook->*p_notebook 

這是s1的int_notebook成員。所以用這個:

test t1(((f1.p_notebook->*p_notebook))); 

您S1的int_notebook成員通過測試的構造函數。所以現在對象t1有一個參考s1的int_notebook成員。它並不關心你用來獲取該成員的模糊程度。它[t1]對f1或f1.p_notebook一無所知。所以,當你這樣做:

f1.p_notebook=&s2; 

這對s1.int_notebook絕對沒有任何影響,因此它具有T1的基準部件沒有影響。

+0

謝謝Benjamin。現在你已經解釋清楚了。我設法通過聲明對類筆記本的引用並相應地修改它來操作int_test來達到目的。哪個工作正常。但是,如果你在堆上工作,似乎這個解決方案,但我會做另一個帖子。再次感謝你。 –