C++ 声明一个C++;类,而不在当前翻译单元中定义它

C++ 声明一个C++;类,而不在当前翻译单元中定义它,c++,class,C++,Class,只要稍后在翻译单元中定义了类,就可以在不定义它的情况下声明类(前向声明)。在函数的情况下,可以声明一个函数,而无需在翻译单元中定义它,链接器将它链接到另一个翻译单元中的定义。对类声明也可以这样做吗 (如果这是不可能的,那么在当前TL中没有定义的前向声明类是否有任何用处,或者这始终是一个错误?) 类似于这样的内容,除了不编译: mymain.cpp: class myclass; // declare without defining myclass::myclass(); void mycla

只要稍后在翻译单元中定义了类,就可以在不定义它的情况下声明类(前向声明)。在函数的情况下,可以声明一个函数,而无需在翻译单元中定义它,链接器将它链接到另一个翻译单元中的定义。对类声明也可以这样做吗

(如果这是不可能的,那么在当前TL中没有定义的前向声明类是否有任何用处,或者这始终是一个错误?)

类似于这样的内容,除了不编译:

mymain.cpp:

class myclass; // declare without defining

myclass::myclass();
void myclass::barf();

int main() {
  myclass *m = new myclass();
  m->barf();
  return 0;
}
myclass.cpp:

#include <iostream>

class myclass { // define the implementation
public:
    myclass();
    void barf();
};

myclass::myclass() { } //empty constructor
void myclass::barf() {
    std::cout << "barfing\n";
}
#包括
类myclass{//定义实现
公众:
myclass();
void barf();
};
myclass::myclass(){}//空构造函数
void myclass::barf(){

std::cout您可以,但前提是您只使用指向该类的指针或引用。但您不能使用引用该类成员(变量或方法)的代码。您只能使用它声明指向该类的指针变量


我建议您使用myclass的完整声明创建一个
myclass.h
头文件,并将该头文件包含在
mymain.cpp

中,您只能通过黑客来实现

使用前声明规则在类()中不适用

否则,您可以将函数声明为模板函数,其模板参数为
myclass
(在您的示例中)


唯一的非黑客方法是定义类(即通过包含其定义的头文件).

可以向前声明类,但只能使用指向向前声明类的指针和引用。不能使用向前声明类的实际对象,因为编译器对其了解不够;尤其是它不知道对象有多大或其成员是什么。正在尝试向前声明成员nctions(正如您所做的)将不起作用,因为forward声明的语法不允许您指定函数是虚拟的还是非虚拟的(或者可能是从某个基类继承的)


在源文件中前向声明类通常不太有用,但在头文件中可能很有用。特别是,在库的公共头文件中前向声明类并将指向该类型的指针用作不透明句柄是很常见的。类定义对于库仍然是私有的,但用户代码可以传递指向对象的指针在不知道类的实现是什么样子的情况下使用该类。当指针是智能指针时,这一点尤其有效。

Uh?不。如果未定义
myclass
,则不能使用
myclass::barf
,即使在指针或引用上也不能使用该类。
myclass
的正向声明也可以声明(但不定义或调用)按值获取或返回
myclass
的函数。为什么使用模板来解决此类问题是一种黑客行为?因为实际上并不需要模板函数。如果不需要,最好避免IMO:模板会增加许多缺点,大多数缺点都是由于编译器造成的(许多编译器不支持关于模板的许多功能,它们的输出变得更加复杂…)