C++从另一个类访问公共静态向量的正确方法是什么
C++ what is the correct way to access public static vector from another class?
考虑以下示例:
//Source.cpp
#include <vector>
#include "MyHeader.h"
class A
{
public:
static std::vector<B*> objects;
};
//MyHeader.h
class B
{
public:
B()
{
A::objects.push_back(this);
}
};
我希望每个类型为B的对象在创建时插入到类A中的向量中。编译后,我得到以下错误:
Error C2065 'objects': undeclared identifier ...MyHeader.h
Error C2653 'A': is not a class or namespace name ...MyHeader.h
我真的不确定这是因为类B在一个单独的文件中,还是因为我这样做的方式完全错误。从类型B的对象访问该向量的正确方法是什么?
问题的解决方案应该是这样的:
//Source.cpp
#include <vector>
#include "MyHeader.h"
class B
{
public:
B()
{
A::objects.push_back(this);
}
};
//MyHeader.h
class B;
class A
{
public:
static std::vector<B*> objects;
};
我们的想法是首先声明类A,但由于它需要指向未定义的类B的指针,所以我们用"向前声明它;B类";,我们可以用它作为指针。最后,我们在cpp类中包含MyHeader.h,让类B了解类A。通过这种方式,您可以使用它的静态成员。
#include
预处理器指令对另一个文件中的代码进行文字复制粘贴。因此,在编译和预处理器阶段之后,您的代码将如下所示(通过在编译器中使用-E选项进行编译,您实际上可以看到此输出(:
//Source.cpp
// whatever is in the vector.h file
class vector {
// stuff
};
//MyHeader.h
class B
{
public:
B()
{
A::objects.push_back(this);
}
};
class A
{
public:
static std::vector<B*> objects;
};
所以,在B类构造函数中,A还没有定义,因为要访问一个类,必须在使用之前定义它。因此,如果您想从MyHeader.h
访问A
类,最好的方法就是将类A
移动到MyHeader.h
中,并使用class B
的前向声明。
//Source.cpp
#include "MyHeader.h"
// main, other code
//MyHeader.h
#include <vector>
class B;
class A
{
public:
static std::vector<B*> objects;
};
class B
{
public:
B()
{
A::objects.push_back(this);
}
};
利用class B
的前向声明,使A
知道定义了B
。
已经给出了正确的答案——这就是正向声明,这是一种常用的技术。我只想指出,只有当您使用指向前向声明类型的指针时,它才会起作用。容器(在您的情况下是向量(必须知道类型的大小。
class B;
class A
{
public:
static std::vector<B*> objects; // size of B* is known - it is the size of a pointer
};
class B;
class A
{
public:
static std::vector<B> objects; // size of B is unknown - an error
};
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 返回向量元素的 l 值的正确方法是什么?
- C++中这个声明的向量是什么意思
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 嵌套向量的缺点是什么?
- 将提升属性树 (ptree) 序列化为向量的最快方法是什么
- 当我使用我的向量名称后跟包含整数变量的括号时,括号是什么意思
- 从向量中提取最小值、最大值和中位数的最有效方法是什么
- 获得给定向量的排列索引列表的最佳方法是什么?
- 不同向量启动作为类成员与方法中不同的矢量启动背后的原因是什么?
- 获取地图值作为向量的最佳方法是什么
- 在C++中初始化布尔向量的标准方法是什么
- 使用 pybind11 将自定义结构(指针向量)从 C++ 传递到 python 的方法是什么?
- 计算每对向量的重复项的有效方法是什么?
- OpenCV 中凸壳函数的输出向量是什么?