具有另一个类对象的 std::vector 的类

Class with a std::vector of another class objects

本文关键字:std vector 的类 对象 另一个      更新时间:2023-10-16

我有两个类(AB(

我需要做一些事情,当我制作一个类 A 的对象(即 A obj()(类B的向量,指向类A要构造的对象。

即如果我将类 A 的对象命名为 obj() ,那么我想要类 B 中向量的第一个元素(即 vector<'A*'> objects ( 由obj()声明。

 objects[0] = obj()

代码:

class B;
class A
{
public:
    A(int _location)
    {
        location = _location;
        pointer_B->redefine(this); // here in this line(14) I get two errors
    }
private:
    int location;
    B* pointer_B;
};
class B
{
public:
    void redefine(A* cur_obj)
    {
        objects.push_back(cur_obj);
    }
private:
    vector<A*> objects;
};

错误是:

use of undefined type B   (line 14)    
left of '->redefine' must point to class/struct/union/generic type (line 14)

正如@IgorTandetnik在注释中指出的那样,您在类AB之间具有循环依赖关系。解决方案是将声明和定义分离到标头源文件并相应地包含标头,或者将函数的定义放在同一翻译单元中的类声明之后。

class B;
class A
{
public:
    A(int _location);
    // .... other declarations  
};
class B
{
public:
    void redefine(A* cur_obj);
    // ...
};
// definitions 
A::A(int _location) {
    location = _location;
    pointer_B->redefine(this);
}
void B::redefine(A* cur_obj) {
    objects.push_back(cur_obj);
}

其他备注

  • 成员pointer_B在 的构造函数中未初始化 A .这很糟糕,因为它会导致未定义行为。因此,在取消引用之前适当地初始化它。
  • 始终首选成员初始值设定项列表初始化类成员: 在下面的帖子中阅读更多内容:为什么我应该更喜欢使用成员初始化列表?

这意味着,更改为:

class A
{
public:
    explicit A(int _location, B *obj);
   //^^^^^^^                 ^^^^^^^^^
    ....
}
A::A(int _location, B *obj)
    : location{ _location }
    , pointer_B{ obj }
{
    pointer_B->redefine(this);
}
```
class B;
class A
{
public:
    A(int _location);
private:
    int location;
    B* pointer_B;
};
class B
{
public:
    void redefine(A* cur_obj)
    {
        objects.push_back(cur_obj);
    }
private:
    vector<A*> objects;
};
A::A(int _location)
{
        location = _location;
        pointer_B->redefine(this);
}