前瞻性类别,功能

时间:2010-12-02 23:45:55

标签: c++ visual-c++

当函数的前向声明在源文件(.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() {
}

6 个答案:

答案 0 :(得分: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,因此会抛出错误。抱歉我的错误;)。

答案 1 :(得分:5)

前向声明class One;允许您引用类本身,但不能引用其任何成员。您必须在完整声明类之后放置类成员的所有定义。 (或者在里面,当然。)

答案 2 :(得分: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 ;
}

答案 3 :(得分:2)

您收到int One:: statVar = 10 ;上的错误消息,而不是转发声明,这很好。

编译器需要知道类的完整定义,然后才能定义类似的静态成员 - 前向声明不足(它需要能够从类定义中确认类型是正确的)。

您需要将静态属性定义移动到类定义下面。

答案 4 :(得分:2)

编译器从头到尾读取内容,并在生成代码时生成代码。 (有些编译器可能不这样做,但它们的行为应该像它们一样。)但是在定义类之前,编译器不知道One::statVarOne::anyAccess应该存在,或者函数是否存在是虚拟的,静态的,还是什么。它需要知道这些东西才能生成代码。

答案 5 :(得分:0)

当你创建2个课程&amp;一个函数可以访问从类到另一个类的数据 然后它是朋友的功能

forword声明用于了解下一个

中的哪个类

class abc;

类xyz

{

数据成员;

公共:

friend void getdata();

其他会员功能

}

班级abc

{

数据成员

公共:

friend void getdata();

}