2017-11-04 188 views
1

我在C++下面的代碼:如何避免前向聲明錯誤?

class Level; 

class Node 
{ 
    char letter; 
    std::string path[2]; 
    Node *next; 
    Level *nlevel; 

    public: 

    Node() 
    { 
     path[0] = ""; 
     path[1] = ""; 
     next = NULL; 
     nlevel = NULL; 
    } 

    Node(char l, unsigned int h) 
    { 
     letter = l; 
     path[0] = ""; 
     path[1] = ""; 
     next = NULL; 
     nlevel = NULL; 
     nlevel->height = h; 
    } 

    virtual ~Node(); 
}; 

class Level 
{ 
    std::list<Node> vnodes; 
    unsigned int height; 

    public: 

    Level(); 
    virtual ~Level(); 
}; 

什麼是來電或聲明的類的正確方法是什麼?我一直在閱讀this,並且我已經嘗試在類節點之前放置class Level;,但是我得到了一個前向聲明錯誤,如果我將每個類分開放在不同的文件中以便稍後包含它,我將會得到一個錯誤,因爲它們互相依賴,所以應該如何宣佈他們?

+1

你會得到什麼「前向聲明錯誤」? – Galik

+0

在'Node'之前放置'class Level'可以正常使用您發佈的代碼。 – Galik

+0

@Galik無效使用不完整類'class Level' –

回答

3

只有在使用前向聲明類的指針時,才能轉發聲明。由於您使用的是Level的成員nlevel->height = h;,因此您必須更改類的定義順序。這將起作用,因爲Level只包含指向Node的指針。

因爲heightLevel的私人成員,所以您還必須將friend class Node;添加到Level類。

class Node; 
    class Level 
    { 
     friend class Node; 
     std::list<Node> vnodes; 
     unsigned int height; 

     public: 

     Level(); 
     virtual ~Level(); 
    }; 

    class Node 
    { 
     char letter; 
     std::string path[2]; 
     Node *next; 
     Level *nlevel; 

     public: 

     Node() 
     { 
      path[0] = ""; 
      path[1] = ""; 
      next = NULL; 
      nlevel = NULL; 
     } 

     Node(char l, unsigned int h) 
     { 
      letter = l; 
      path[0] = ""; 
      path[1] = ""; 
      next = NULL; 
      nlevel = NULL; 
      nlevel->height = h; 
     } 

     virtual ~Node(); 
    }; 
+0

有道理。我沒有嘗試過,因爲我沒有將任何Node *節點放入我的課程級別。謝謝,羅伯特。 –

1

解決這個問題的方法是把函數定義爲Node後的Level類定義,因此編譯器提供其完整的類型描述:

class Level; 

class Node 
{ 
    char letter; 
    std::string path[2]; 
    Node *next; 
    Level *nlevel; 

    public: 

    Node(); // put the definition after 

    Node(char l, unsigned int h); 

    virtual ~Node(); 
}; 

class Level 
{ 
    std::list<Node> vnodes; 
    unsigned int height; 

    public: 

    Level(); 
    virtual ~Level(); 
}; 

// put node's function definitions AFTER the definition of Level 
Node::Node() 
{ 
    path[0] = ""; 
    path[1] = ""; 
    next = NULL; 
    nlevel = NULL; 
} 

Node::Node(char l, unsigned int h) 
{ 
    letter = l; 
    path[0] = ""; 
    path[1] = ""; 
    next = NULL; 
    nlevel = NULL; 
    nlevel->height = h; // Now you have access problem 
} 

或者你可以移動功能定義爲單獨的.cpp源文件。

現在你有一個新問題,nlevel->height = h;正在嘗試訪問私人成員Level