2013-04-04 216 views
3

的提前声明我有一个类:C++类的静态成员

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

与后来来初始化。我想在不同的类(头文件)后用动感:: T:

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

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

回答

4

不,你不能。您可以将标题包含在标题中,也可以将执行文件Use::f分隔为一个实现文件,并在其中包含M的标题。

+0

不错。你实际上回答了我的递归包含的另一个问题:-) – arthur 2013-04-04 08:42:57

3

在C#中没有类似partial的类,您可以在其中定义一个类在多个文件中。
由于您正在使其成为public static成员,因此您为什么不创建名称空间并在其中嵌入它?

namespace myns{ 

std::string t[]; 

} 

您可以从任何地方然后访问它,就像你会用public static类成员来完成。

1

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

这里是解决办法,如果你不希望包括MH在Use.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; 
} 

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