2012-09-22 63 views
0

主要工作中的線可以嗎?也許其他運營商?一些建議? 我認爲這裏的操作順序是問題。是否必須使用b.addA(「P」); b.R( 「P」)REF(b.R( 「P」)); ?訪問班級成員的C++操作順序

我想將對象的引用添加到其他對象,並在對象之間建立關係,如數據庫模型。

#include <iostream> 
#include <vector> 
#include <string> 

class A; 
class B; 

class A{ 
    std::string _name; 
    std::vector<A*> _refs; 
public: 
    A(std::string=""); 
    A& ref(A&); 
    std::string name() const; 
}; 

class B{ 
    std::string _name; 
    std::vector<A> _as; 
public: 
    B(std::string=""); 
    A& addA(std::string); 
    A& R(std::string); 
}; 

A::A(std::string nm){ 
    _name=nm; 
} 

A& A::ref(A &a){ 
    for(int i=0; i<_refs.size(); i++) 
     if(_refs[i]==&a) 
      return a; 
    _refs.push_back(&a); 
    return a; 
} 

std::string A::name() const{ 
    return _name; 
} 

B::B(std::string nm){ 
    _name=nm; 
} 

A& B::addA(std::string nm){ 
    for(int i=0; i<_as.size(); i++) 
     if(_as[i].name()==nm) 
      return _as[i]; 
    _as.push_back(A(nm)); 
    return _as[_as.size()-1]; 
} 

A& B::R(std::string nm){ 
    for(int i=0; i<_as.size(); i++) 
     if(_as[i].name()==nm) 
      return _as[i]; 
    throw std::string("invaild A"); 
} 

int main(){ 
    B b; 
    b.addA("P").ref(b.R("P")); 
    return 0; 
} 
+0

(其中包括)我認爲這是錯誤的:'_as。的push_back(A :: A(nm)的);'。也許你的意思是'_as.push_back(A(nm));' –

+0

@MihaiTodor:我認爲這很好,因爲我想存儲在我的A型矢量中,名爲_as我的「子對象」 –

+0

你不能/不應該直接調用類的構造函數,即使VS2010似乎允許它。糾正這一點後,我仍然在GCC中遇到一個奇怪的錯誤,但我不知道爲什麼。 –

回答

2

可在主要的工作線?

當然。這裏只有兩個運算符,函數調用和引用(點運算符)。如果關聯是從左至右,或者函數調用優先於參考,則會出現問題。事實並非如此。函數調用和引用具有相同的優先級,並且關聯從左到右。這正是你想要的。

但是,您的代碼存在問題。這是成員函數B::A。在類B的範圍內,這將A的含義從class A更改爲成員函數B::A(std::string)。你的代碼無法在多個編譯器上編譯,但它在編譯時使用了clang 3.1。 這看起來像是一個叮噹聲蟲。 附錄:這與clang編譯是可以的,因爲違反的規則是那些討厭的「不需要診斷」規則之一。)你的代碼是非法的;它(理想情況下)應該不能編譯。

該功能的更好名稱是findA。該名稱不會與類名衝突,並且會使代碼自行記錄。

旁白:您可能想要讓該函數返回一個指針而不是參考。例外情況應該用於例外事件(即錯誤)。事實是(例如)「Foo」在您的向量中沒有真正值得拋出異常?

+0

更改A&B :: A(標準偏差::字符串)爲A&B :: R(標準偏差::字符串),問題仍然存在... :( –

+0

它也編譯VS2010,但它仍然[非法] (http://stackoverflow.com/a/12187709/1174378)。 –

+0

我想返回引用來編寫鏈式指令,就像在緬因州。 –

0

要開始在主線將肯定工作。 現在如何發生這是一個你會感興趣的問題? 當您調用addA(「P」)時,它會創建A類的對象並通過引用返回它, 現在A的這個對象調用其成員fn ref(A &),如您所見,您需要傳遞一個對象A引用這個函數,它通過調用bR(「P」)來完成,它本身返回對字符串「P」剛剛添加的對象的引用。現在你有

A'.ref(A 「)

其中A」 A」 由兩個不同的FN B級返回被引用的對象(bydway在這種情況下A'A「將是相同的)。

上述呼叫將通過參考返回類A的另一目的,其可以分配到的像

甲噸任何其他實例; 噸= b.addA(「P」)REF(BR(。 「P」));

你只是在做鏈式函數調用並通過返回obj通過引用等方式確保臨時變量中沒有任何事情發生,您可能會失去。 希望我已經回答了你的問題。

+0

問題是,首先調用bR(「P」)如果我在類之間創建友誼並使ref(std :: string)通過pointe r到b它有想要的結果。更詳細的說,在AI中可以有B * _myb並且在ref(std :: string nm)_myb-> R(nm)中調用以找到類型A的對象並將其添加到ref中,那麼對ref的調用將會像b.addA( 「P」)。REF( 「P」)。這工作。 –