2016-11-05 48 views
1

嗨我想解決這個錯誤,當我嘗試將鏈接列表傳遞給另一個類時,我得到了。我已經看過其他問題,但他們似乎沒有解決這個問題。我如何解決「[錯誤]使用不完整的類'SLLNode'」鏈接列表

我還需要SLLNode留在ListAsSLL因爲這是父母的其他類

DynamicSizeMatrix應該有一個聚集到ListAsSLL

我DynamicSizeMatrix.cpp文件

#include "DynamicSizeMatrix.h" 
#include<iostream> 
#include<string> 
#include<cassert> 
#include<cstdlib> 
#include"ListAsSLL.h" 

using namespace std; 

DynamicSizeMatrix::DynamicSizeMatrix(SLLNode* sll,int r, int *c) 
{ 

    rws = r; 
    col = new int [rws]; 
     for(int x=0; x < rws; x++) // sets the different row sizes 
     { 
      col[x] = c[x]; 
     } 

    SLLNode *node = sll ; 
// node = sll.head; 

    *info = new SLLNode*[rws]; 
    for (int x= 0; x< rws;x++) 
    { 
     info[x] = new SLLNode*[col[x]]; 

    } 

    for(int x=0;x<rws;x++) 
    { 
     for(int y=0;y<col[x];y++) 
     { 
      info[x][y] = node; 
      node = node->next; // My error happens here 

     } 
    } 


} 

我「DynamicSizeMatrix.h」

#include"ListAsSLL.h" 
#include "ListAsDLL.h" 
#include"Matrix.h" 
#include"Object.h" 
class SLLNode; 

class DynamicSizeMatrix : public Matrix 
{ 

private: 
    SLLNode*** info; 
    //Object* colmns; 
    int rws; 
    int *col; //array of column sizes 
    // int size; 

public: 
    DynamicSizeMatrix() 
    { 
     info = 0; 
     rws = 0; 
     col = 0; 
    } 
    DynamicSizeMatrix(SLLNode* sll,int r, int *c); 
//...... 

a ND「ListAsSLL.h」提前

+0

'SSLNode'被聲明爲嵌套類的' ListAsSLL「,但是在該範圍之外聲明前向。將它從ListAsSLL的作用域移出。 –

回答

0

在你的類ListAsSLL,從外部類的點

class ListAsSLL : public List 
{ 
    //friend class LLIterator; 
    friend class DynamicSizeMatrix; 
    protected: 

     struct SLLNode 
     { 
       Object* info; 
       SLLNode* next; 
      // SLLNode(Object *e, ListAsSLL::SLLNode* ptr = 0); 
     }; 

     SLLNode* head; 
     SLLNode* tail; 
     SLLNode* cpos; //current postion; 
     int count; 

    public: 

      ListAsSLL(); 

     ~ListAsSLL(); 
     ////////////// 

由於使用它,它只能訪問public成員。正如你可以看到你的SLLNode在protected部分。

所以,你有兩個選擇真(好吧,其實也有不少),但這裏是兩個保持它在同一個文件封裝爲至少:

  1. 移動SLLNode聲明成public部分,然後使用它,如:ListAsSLL::SLLNode而不是隻有SLLNode
  2. 只要將它移到類的外部以使其可以接受所有包含「ListAsSLL.h」的人。

我喜歡的方法1,因爲它使範圍更小/更相關,但沒有太多的它真的....例如:

class ListAsSLL : public List 
{ 
    public: 
     struct SLLNode 
     { 
       Object* info; 
       SLLNode* next; 
     }; 
     ListAsSLL(); 

    protected: 
     SLLNode* head; 
     SLLNode* tail; 
     SLLNode* cpos; //current postion; 
     int count; 
+0

現在在我的其他類中,使用SLLNode的人說SLLNode沒有指定類型 –

+0

@JaynillGopal這將解決您的問題,但允許喜歡列表的用戶訪問節點是有風險的。該解決方案打破封裝並允許鏈表的用戶修改列表的狀態。例如,用戶可能會惡意地或錯誤地使用'myNode.next = some_other_address;'並打破列表。 – user4581301

+0

@ user4581301 - 不,只有結構在公共部分。節點本身在受保護的部分 - 安全和聲音:) –

相關問題