我有一堂课:
class M {
public:
static std::string t[];
};
稍后会进行初始化。我想稍后在不同的类(头文件)中使用 M::t:
class Use {
public:
void f() { std::cout << M::t[0] << std::endl; }
};
有没有什么方法可以在不包括整个 M 类的情况下使用的头文件?我知道前向声明不允许访问类成员,但是这种美是静态的,所以它对编译器来说应该不是一个大问题。
我有一堂课:
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
标头。
没有partial
像 C# 中的类,您可以在多个文件中定义一个类。
既然你让它成为一个public static
成员,你为什么不创建一个命名空间并将它嵌入到那里呢?
namespace myns{
std::string t[];
}
你可以从任何地方访问它,就像你对public static
班级成员所做的那样。
前向声明只允许您使用前向声明的类指针或引用,而不是成员!如果您想使用示例中的类成员,则必须包含类头,即使它是静态的。
如果您不想在 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;
}
此外,您必须知道在头文件中编写代码是一个坏习惯,当然内联和模板除外。