簡體   English   中英

關於前向聲明c ++類

[英]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(); ,它知道bB一個實例,但它不知道getctxt1()是否是B的方法,因為它在下面。 如果您在一個文件中編寫所有內容,則應首先編寫所有聲明,然后編寫所有實現。

沒有人注意到Class B語法錯誤? 小寫class是正確的。 A中的兩個公共成員同名int bB *b

刪除它們並用分號完成類定義后,在void getctxt1()中添加一個void類型,它在B中缺少它。

只需定義應定義的函數。 沒有理由你不知道是哪個!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM