繁体   English   中英

前瞻性类别,功能

[英]Forward Declaration of Class, Function

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

前向声明也适用于类:

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,因此会抛出错误。 对不起,我错了 ;)。

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

在成员实现之前放置您的类的成员声明。

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 ;
}

您在int One:: statVar = 10 ;上收到错误消息int One:: statVar = 10 ; 不是前瞻性声明,这很好。

在您可以定义类似的静态成员之前,编译器需要知道类的完整定义 - 前向声明是不够的(它需要能够从类定义确认类型是正确的)。

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

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

当你创建2个类时,一个函数可以访问从类到另一个类的数据,那么它就是一个友元函数

forword声明用于知道接下来的哪个类

class abc;

类xyz

{

数据成员;

上市:

friend void getdata();

其他成员函数

}

班级abc

{

数据成员

上市:

friend void getdata();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM