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

How can I deal with cyclic composition in C++?

本文关键字:循环 组合 c++ 何处理 处理      更新时间:2023-10-16

我试图在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() {}
};

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

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

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();
    }
};

你可以向前声明指针类型:

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();
    }
};