静态类成员的前向声明

c++ forward declaration of a static class member

本文关键字:声明 成员 静态类      更新时间:2023-10-16

我有一个类:

class M {
public:
    static std::string t[];
};

,稍后进行初始化。我想稍后在另一个类(头文件)中使用M::t:

class Use {
public:
    void f() { std::cout << M::t[0] << std::endl; }
};

有没有办法实现这一点,而不包括整个类M的头文件的使用?我理解前向声明不允许访问类成员,但是这种美丽是静态的,所以它不应该是编译器的一个大问题。

不行。您可以在头文件中包含头文件,或者在实现文件中单独包含Use::f的实现,并在那里包含M的头文件。

没有像c#那样的partial类,你可以在几个文件中定义一个类。
既然要使它成为public static成员,为什么不创建一个名称空间并将其嵌入其中呢?

namespace myns{
std::string t[];
}

你可以从任何地方访问它,就像你对public static类成员所做的那样。

前向声明只允许使用前向声明的类指针或引用,而不允许使用成员!如果你想在你的例子中使用类成员,你必须包括类头,即使它是静态的。

如果你不想在Use.h头文件中包含M.h,那么解决方法是:

Use.h

class Use {
public:
    void f();
};

Use.cpp

#include "M.h"
#include "Use.h"
void Use::f() {
    std::cout << M::t[0] << std::endl;
}

另外,您必须知道在头文件中编写代码是一个坏习惯,当然内联和模板除外。