设置指向对象的指针,使对象指向彼此

时间:2013-03-27 15:40:36

标签: c++

我正在创建一个名为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;
}

3 个答案:

答案 0 :(得分:0)

createPairing应为static

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

除此之外,问题是当你执行Team createPairing(p1, p2);时,你实际上并没有调用createPairing函数,而是调用第二个构造函数 隐式。它正在创建名为Team的{​​{1}}并将createPairing转换为p1。 (编译时应该有一个警告,假设你有警告。)

制作bool函数createPairing后,您可以这样称呼它:

static

答案 1 :(得分: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);
}

答案 2 :(得分: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;
}