2016-11-05 2 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 й «ListAsSLL.h»

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(); 
     ////////////// 

Заранее спасибо

+0

'SSLNode' объявлен как вложенная класса' ListAsSLL', но форвард объявлен вне этой области. Извлеките его из области ListAsSLL. –

ответ

0

В вашем классе ListAsSLL, с точки зрения внешнего класса, используя его, он имеет доступ только к открытым членам. Как вы можете видеть, ваш SLLNode находится в разделе protected.

Так у вас есть два варианта действительно (ну, на самом деле есть довольно много), но вот два, которые держат его инкапсулированный в том же файле, как минимум:

  1. Move декларации 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 - нет, только структура находится в общедоступном разделе. Сами узлы находятся в защищенном разделе - безопасном и звуковом :) –

Смежные вопросы