C ++中两个类对象的循环引用

时间:2014-11-11 14:12:56

标签: c++

是否可以实现此代码?

class apple;
class fruit{
    public: int i;
    void set(apple a){
    }
};

class apple{
    public: int j;
    void set(fruit f){
    }
};

我知道这会导致错误:' a'有不完整的类型。即使我交换类,它总是导致不完整的类型错误。我有一个问题可以实现吗?我不确定。任何帮助都很有用。感谢

更新

class apple;
class fruit{
    public: int i;
    void set(apple* a);
};

class apple{
    public: int j;
    void set(fruit f){
    }
};
void fruit::set(apple *a){
  apple b = *a;
}

我猜这个解决方法有效。但还有其他解决方案吗?

3 个答案:

答案 0 :(得分:3)

这是可能的,但你需要在类之外有方法定义:

class apple;

class fruit {
public:
    int i;
    void set(apple a);
};

class apple {
public:
    int j;
    void set(fruit f);
};

void fruit::set(apple a)
{
    i = a.j;
}
void apple::set(fruit f)
{
    j = f.i;
}

答案 1 :(得分:1)

使用指针或引用,因为在这种情况下只需要知道名称:

class apple;

class fruit{
    public: 
    int i;
    void set(apple* a); // OK
    void set(apple& a); // Also OK
};

您需要将函数的实现移动到已知apple定义的位置。

答案 2 :(得分:0)

你不能有像这样的循环引用。唯一的可能性是使用指向对象而不是对象的指针,如:

class apple;
class fruit{
    public: int i;
    void set(apple * a){
    }
};

class apple{
    public: int j;
    void set(fruit * f){
    }
};

并使用函数内的去引用对象进行管理,即在这些函数apple::setfruit::set的实现中使用* f 如果您希望在作为指针传递时使对象不可修改,请使用:

class apple;
class fruit{
    public: int i;
    void set(const apple * a){
    }
};

class apple{
    public: int j;
    void set(const fruit * f){
    }
};