2016-10-18 10 views
2

У меня есть класс List, который имеет два вложенных класса:и ListIterator. В классе ListIterator у меня есть атрибут типа ListItem. В заголовочном файле «List.h» я определил ListItem как частный атрибут класса ListIterator и скомпилирован. Но, в файле «List.cpp», когда я пытаюсь определить конструктор ListIterator он дает мне ошибку:В C++, как я могу использовать тип вложенного класса в другом вложенном классе (два вложенных класса находятся под тем же внешним классом)

List.cpp: In constructor ‘List::ListIterator::ListIterator(bool)’: 
List.cpp:24:46: error: no matching function for call to ‘List::ListItem::ListItem()’ 
List::ListIterator::ListIterator(bool reverse){ 
              ^
List.cpp:24:46: note: candidates are: 
List.cpp:7:1: note: List::ListItem::ListItem(void*) 
List::ListItem::ListItem(void* data){ 
^ 
List.cpp:7:1: note: candidate expects 1 argument, 0 provided 
In file included from List.cpp:1:0: 
List.h:2:8: note: List::ListItem::ListItem(const List::ListItem&) 
class ListItem { 
    ^
List.h:2:8: note: candidate expects 1 argument, 0 provided 

Вот мой list.h файл:

class List{ 
class ListItem { 
    public: 
     ListItem(void*); 
     void* getData(); 
     ListItem* getNext(); 
     ListItem* getPrev(); 
    private: 
     void* data; 
     ListItem* next; 
     ListItem* prev; 
}; 

class ListIterator { 
    public: 
     ListIterator(bool); 
     bool hasNext(); 
     void* next(); 
    private: 
     bool reverse; 
     ListItem current; 
}; 
public: 

    List(); 
    ~List(); 
    long getSize(); 
    int addData(void*); 
    void* remove(long); 
    long indexOf(void*); 
    ListIterator* cellAt(long); 
    ListIterator& iterator(bool); 
private: 
    long size; 
    ListItem head; 
    ListItem tail; 
}; 

И вот мой файл List.cpp:

#include "List.h" 
#include <iostream> 

using namespace std; 

/* ListItem */ 
List::ListItem::ListItem(void* data){ 
    this->data = data; 
} 

void* List::ListItem::getData(){ 
    return this->data; 
} 

List::ListItem* List::ListItem::getNext(){ 
    return this->next; 
} 

List::ListItem* List::ListItem::getPrev(){ 
    return this->prev; 
} 

/* ListIterator */ 
List::ListIterator::ListIterator(bool reverse){ 
    this->reverse = reverse; 
} 

bool List::ListIterator::hasNext(){ 
    return false; 
} 

void* List::ListIterator::next(){ 
    return NULL; 
} 

ответ

1

Ваша проблема не в вложении классов, а в инициализации членов.

При создании ListIterator вы также строительство своих членов, так ListItem, то вам необходимо указать CTOR вызов для него, как это имеет определенный пользователь:

List::ListIterator::ListIterator(bool b) : current(something) { 
    ... 
} 

Это способ выразить как инициализируется current.

+0

И я что-то заменю чем-то вроде current (ListItem l)? –

+0

Вам нужно передать значение, чтобы решить проблему, подумайте, как «что мой объект-классификатор должен иметь в начале?». Я подозреваю, что ваш аудитор должен указать на какой-то список, так? Затем передайте listitem (возможно, указатель на) ... Читайте об примерах реализации итераторов. –

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

  • Нет связанных вопросов^_^