当函数的前向声明在源文件(.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() {
}
答案 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::statVar
或One::anyAccess
应该存在,或者函数是否存在是虚拟的,静态的,还是什么。它需要知道这些东西才能生成代码。
答案 5 :(得分:0)
当你创建2个课程&amp;一个函数可以访问从类到另一个类的数据 然后它是朋友的功能
forword声明用于了解下一个
中的哪个类class abc;
类xyz
{
数据成员;
公共:
friend void getdata();
其他会员功能
}
班级abc
{
数据成员
公共:
friend void getdata();
}