2013-03-27 183 views
2

我正在創建一個名爲Team的類。我怎樣才能讓兩個對象指向對方作爲合作伙伴?這是我迄今爲止所做的工作。我已經用布爾數據字段對它進行了測試,並且我知道我的程序的其餘部分工作到目前爲止。設置指向對象的指針,讓對象指向對方

#include <iostream> 
using namespace std; 

class Team 
{ 
    public: 

    Team(); 
    Team(bool prac, Team *part); 
    Team *partner; 
    bool practiced; 
    void createPairing (Team *t1, Team *t2); 
}; 


Team::Team() 
{ 
    practiced = false; 
    partner = 0; 
} 

Team::Team(bool prac, Team *part) 
{ 
    practiced = prac; 
    partner = part; 
} 

void Team::createPairing (Team *t1, Team *t2) 
{ 
    t1->partner = t2; 
    t2->partner = t1; 
} 

int main() 
{ 
    Team Harry; 
    Team Ron; 
    Team *p1 = &Harry; 
    Team *p2 = &Ron; 
    Team createPairing(p1, p2); 

    cout << Harry.partner << endl; 
    return 0; 
} 

回答

0

createPairing應該是static

static void createPairing(Team* t1, Team* t2); 

除此之外,問題是,當你做Team createPairing(p1, p2);,你不是實際調用createPairing功能,你調用第二個構造含蓄地。它創建了一個名爲createPairingTeam並將p1轉換爲bool。 (應該有這樣的警告當您編譯假設你有警告)

您做出createPairing功能static後,這是你會怎麼稱呼它:

Team::createPairing(&Harry, &Ron); 
+0

謝謝你的建議。不過,以下內容仍然返回給合作伙伴。當我試圖在函數聲明中放置靜態void時,我的編譯器給了我一個錯誤,指出靜態只能在類定義中指定。也就是說,我在類定義中定義了靜態void(createPartner),但在定義函數時我無法做到這一點。 – 2013-03-27 15:49:40

+0

@安妮韋爾是的,你只是在課堂上的聲明上做。 – 2013-03-27 15:51:52

+0

只能在課堂內使用'static'。當你編寫函數的實現時,你不應該使用'static'。 – 2013-03-27 15:54:07

0

如果你想要有兩個參數配對你應該使這個自由功能(課外)。否則,我建議省略第一個參數(從對象的角度來看它是「this」)。兩者都有助於防止magtheridon96已經提供修復的錯誤。

void Team::createPairing (Team *other) 
{ 
    partner = other; 
    other->partner = this; // here, making the member private and providing a setter would be better 
} 

,或者作爲一個自由函數(setter方法)

void createPairing(Team& lhs, Team& rhs) // use references to avoid potential pointer issues 
{ 
    lhs.setPartner(&rhs); 
    rhs.setPartner(&lhs); 
} 
+0

謝謝,這非常有幫助。 – 2013-03-27 18:45:39

+0

你可以請。如果可能,請投票? – ogni42 2013-03-28 14:11:42

0
#include <iostream> 
using namespace std; 

class Team 
{ 
    public: 

    Team(); 
    Team(bool prac, Team *part); 
    Team *partner; 
    bool practiced; 
    static void createPairing (Team *t1, Team *t2); 
}; 


Team::Team() 
{ 
    practiced = false; 
    partner = 0; 
} 

Team::Team(bool prac, Team *part) 
{ 
    practiced = prac; 
    partner = part; 
} 

void Team::createPairing (Team *t1, Team *t2) 
{ 
    t1->partner = t2; 
    t2->partner = t1; 
} 

int main() 
{ 
    Team Harry; 
    Team Ron; 
    Team *p1 = &Harry; 
    Team *p2 = &Ron; 
    Team::createPairing(p1, p2); 


    return 0; 
}