类和函数的前置声明

10

当函数的前向声明在源文件(.cpp)中可用时,为什么同样的方法不能用于类?

谢谢。

// main.cpp

void forwardDeclaredFunction() ; // This is correct 

class One ; // Why this would be wrong 

int One:: statVar = 10 ;

void
One :: anyAccess() {

 std::cout << "\n statVar:\t " << statVar ;
 std::cout << "\n classVar:\t" << classVar ;
}

class One {

 public:
  void anyAccess() ;
  static int statVar ;

 private:
  int  classVar ;

} ;


int main (int argc, char * const argv[]) {

 One *obj = new One ;

        return 0;
}

void forwardDeclaredFunction() {
}

3
“class One;” 是正确的前向类声明语法。你确切地得到了什么编译器错误信息? - In silico
1
错误:无效使用不完整类型Struct One;我正在Mac上运行 - Mahesh
6个回答

12

前置声明也适用于类:

class Foo;

class Bar {
public:
    Foo *myFoo; // This has to be a pointer, thanks for catching this!
};

class Foo {
public:
    int value;
};
以上代码展示了对Foo类的前向声明,并在另一个类(Bar)中使用了类型为Foo*的变量,然后是对Foo类的实际定义。C++不关心你是否留下未实现的部分,只要在使用它的代码之前实现它们即可。定义指向某种类型对象的指针并不是“使用其代码”。 简短而粗略的回复,但我希望它有所帮助。
编辑:声明一个未实现的非指针类变量将无法编译,正如回复所述。这正是我所说的“使用其代码”。在这种情况下,每当调用Bar构造函数时,都会调用Foo构造函数,因为它具有类型为Foo的成员变量。由于编译器不知道您打算稍后实现Foo,因此它会引发错误。抱歉我的错误 ;)。

2
据我所知,前向声明不允许您拥有所声明的类的对象,只能是指针和可能的引用。在您的示例中,编译器无法确定 sizeof(Foo),因此无法定义 Bar - cHao
2
这段代码无法编译,原因和 OP 的代码失败一样:你在完全了解 Foo 结构之前就使用了它(gcc 会告诉你“字段 'myFoo' 具有不完整的类型”)。 - Lars
1
不要忘记,您也可以声明一个引用,只需前向声明其类型,例如:const Foo&myFoo - Moo-Juice

5
前置声明class One;可以让你引用到这个类本身,但无法引用它的任何成员。你需要在完整声明这个类后面(当然也可以在里面)定义所有类成员。

3
将类的成员声明放在成员实现之前。
class One {

 public:
  void anyAccess() ;
  static int statVar ;

 private:
  int  classVar ;

} ;

int One:: statVar = 10 ;

void
One :: anyAccess() {

 std::cout << "\n statVar:\t " << statVar ;
 std::cout << "\n classVar:\t" << classVar ;
}

2
您在int One:: statVar = 10 ;处收到错误消息,而不是在前向声明处,这是可以的。
编译器需要在您定义静态成员之前知道类的完整定义 - 前向声明是不够的(它需要能够从类定义中确认类型是否正确)。
您需要将静态属性定义移动到类定义下方。

2
编译器顺序读取代码并在读取时生成代码。 (有些编译器可能不这样做,但它们应该表现得像这样。) 但是在类定义之前,编译器不知道 One::statVarOne::anyAccess 是否存在,或者函数是否虚拟、静态等。为了生成代码,编译器需要知道这些信息。请注意,HTML 标记将保留。

0

当你创建了两个类并且一个函数可以访问另一个类的数据时,那么它就是一个友元函数。

前向声明用于知道下一个类是哪个。

class abc;

class xyz

{

数据成员;

公共的:

友元函数 void getdata();

其他成员函数

}

类 abc

{

数据成员

公共:

友元函数 void getdata();

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接