[英]Regarding forward declaration c++ class
我有兩個這樣的課程:
class B;
class A {
public:
int a, b;
B *b;
public:
int getctxt()
{
b->getctxt1();
}
}
Class B {
public:
int c,d;
A *a;
getctxt1()
{
/* something */
}
}
main()
{
B *b = new B();
A *a = new A();
b->a = a;
a->b = b;
}
但是,當我嘗試編譯時,它說
無效使用不完整類型'struct A'。
誰能告訴我如何解決這個問題?
內聯類成員函數定義被解析,就好像它們出現在類定義之后。 當然, B
在那時沒有定義。 因此,將A::getctxt
的成員函數定義移出A
類的定義:
class B;
class A { int getctxt(); /* ... */ };
class B { /* ... */ };
int A::getctxt()
{
b->getctxt1(); // at this point, *b has complete type!
return -35;
}
這就是為什么建議在.h文件和.cpp文件中分離類的原因。 當你寫class B;
,你告訴編譯器有一個叫做B的類,但就是這樣,編譯器不知道這個類里面有什么。 當編譯器到達b->getctxt1();
,它知道b
是B
一個實例,但它不知道getctxt1()
是否是B
的方法,因為它在下面。 如果您在一個文件中編寫所有內容,則應首先編寫所有聲明,然后編寫所有實現。
沒有人注意到Class B
語法錯誤? 小寫class
是正確的。 A中的兩個公共成員同名int b
和B *b
。
刪除它們並用分號完成類定義后,在void getctxt1()
中添加一個void類型,它在B中缺少它。
只需定義應定義的函數。 沒有理由你不知道是哪個!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.