C++从另一个类访问公共静态向量的正确方法是什么

C++ what is the correct way to access public static vector from another class?

本文关键字:向量 是什么 方法 静态 另一个 访问 C++      更新时间:2023-10-16

考虑以下示例:

//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
};