如何处理C ++中的循环组合?

时间:2015-10-11 21:16:47

标签: c++

我正在尝试用C ++创建一个循环组合,但我正在处理声明问题。我怎么能解决它们?

这是一个例子,A类包含B对象的向量,但是B类需要首先声明A,因为它在构造函数中需要:

class A {
private:
    std::vector<B> sons;
public:
    void create_son() {
        B obj(this);
        sons.push_back(obj);
        obj.some_method();
    }
};

class B {
private:
    A* parent;
public:
    B (A* _parent) { parent = _parent; }
    void some_method() {}
};

2 个答案:

答案 0 :(得分:4)

class A中,您使用class B的对象,因此需要class B的完整定义。要解决此问题,请将class B定义置于class A之上。同时,在class B中,您只使用指向A的指针,因此您不需要class A的完整定义:声明就足够了。

因此,在class A定义之上添加class B的前向声明。

class A;

class B {
private:
    A* parent;
public:
    B (A* _parent) { parent = _parent; }
    void some_method() {}
};

class A {
private:
    std::vector<B> sons;
public:
    void create_son() {
        B obj(this);
        sons.push_back(obj);
        obj.some_method();
    }
};

答案 1 :(得分:1)

您可以转发声明指针类型:

class A;   // sufficient to fully determine B

class B {
private:
    A* parent;
public:
    B (A* _parent) { parent = _parent; }
    void some_method() {}
};

// now we have B defined, we can define A
class A {
private:
    std::vector<B> sons;
public:
    void create_son() {
        B obj(this);
        sons.push_back(obj);
        obj.some_method();
    }
};