6

我有一堂课:

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

稍后会进行初始化。我想稍后在不同的类(头文件)中使用 M::t:

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

有没有什么方法可以在不包括整个 M 类的情况下使用的头文件?我知道前向声明不允许访问类成员,但是这种美是静态的,所以它对编译器来说应该不是一个大问题。

4

3 回答 3

6

不,你不能。您可以在标头中包含标头,也可以Use::f在实现文件中分离实现并在其中包含M标头。

于 2013-04-04T08:41:38.647 回答
3

没有partial像 C# 中的类,您可以在多个文件中定义一个类。
既然你让它成为一个public static成员,你为什么不创建一个命名空间并将它嵌入到那里呢?

namespace myns{

std::string t[];

}

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

于 2013-04-04T08:44:11.093 回答
1

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

如果您不想在 Use.h 标头中包含 Mh,则可以使用以下解决方案:

使用.h

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

使用.cpp

#include "M.h"
#include "Use.h"

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

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

于 2013-04-04T08:51:57.877 回答