Class 与另一个 class 个对象的 std::vector
Class with a std::vector of another class objects
我有两个 classes(A
和 B
)
当我将 class 的对象 A(即 A obj()
)作为 [ 的向量时,我需要做一些事情=38=] B 指向class的对象被构造A
.
即
如果我创建一个名为 class A
的对象 obj()
,那么我希望 class 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)
```
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);
}
正如 @IgorTandetnik 在评论中指出的那样,您在 class A
和 B
之间有 circular dependency。解决方案是将声明和定义分开到 header-source 文件并相应地包含 headers 或将函数定义放在同一翻译单元中 classes 的声明之后。
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
在构造函数中是un-initialized
A
。这很糟糕,因为它会导致 undefined
行为。
因此在取消引用之前适当地初始化它。
- 总是喜欢成员初始值设定项
列出
初始化 class 成员:阅读以下 post 中的更多信息:Why should I prefer to use member initialization list?
也就是说,改为:
class A
{
public:
explicit A(int _location, B *obj);
//^^^^^^^ ^^^^^^^^^
....
}
A::A(int _location, B *obj)
: location{ _location }
, pointer_B{ obj }
{
pointer_B->redefine(this);
}
我有两个 classes(A
和 B
)
当我将 class 的对象 A(即 A obj()
)作为 [ 的向量时,我需要做一些事情=38=] B 指向class的对象被构造A
.
即
如果我创建一个名为 class A
的对象 obj()
,那么我希望 class 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)
```
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);
}
正如 @IgorTandetnik 在评论中指出的那样,您在 class A
和 B
之间有 circular dependency。解决方案是将声明和定义分开到 header-source 文件并相应地包含 headers 或将函数定义放在同一翻译单元中 classes 的声明之后。
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
在构造函数中是un-initializedA
。这很糟糕,因为它会导致 undefined 行为。 因此在取消引用之前适当地初始化它。 - 总是喜欢成员初始值设定项 列出 初始化 class 成员:阅读以下 post 中的更多信息:Why should I prefer to use member initialization list?
也就是说,改为:
class A
{
public:
explicit A(int _location, B *obj);
//^^^^^^^ ^^^^^^^^^
....
}
A::A(int _location, B *obj)
: location{ _location }
, pointer_B{ obj }
{
pointer_B->redefine(this);
}