2012-03-26 3 views
0

У меня есть классс ++ класс относится друг к другу

class PCB { 
    public: 
    struct { 
     string type; 
     **linklist list;**//refer to list which contains PCB instance 
    } status; 
} 

то, что я хочу, чтобы создать экземпляр класса PCB, но экземпляр находится в списке linklist. я построить класс linklist, как показано ниже

class linklist 
{ 

    public: 

    void append(PCB num); 
}; 
void linklist::append(PCB num){ 
} 

Ошибка occus говоря Num выше находится в типе ошибки. что я буду делать в этом случае?

+0

Есть ли они в одном файле? Можете ли вы указать конкретное сообщение об ошибке? – xdhmoore

+1

Почему вы пишете свой собственный список, вместо того, чтобы использовать 'std :: list'? – Wyzard

+0

@Wyzard: Обычное (домашнее задание) упражнение или подготовка к собеседованию? –

ответ

-1
  1. Вы можете использовать вперед декларацию:

    class linklist; // forward declaration 
    
    class PCB { 
    
        public: 
        struct { 
         string type; 
         linklist list; //refer to list which contains PCB instance 
        } status; 
    } 
    
  2. Или, когда вы только обратитесь к типу по ссылке или указателю, вам не нужно включать это заголовочный файл.

    linklist* list 
    
+0

http://ideone.com/v8Mv6 Вперед декларация должна идти в _other_ файле. Он не может попасть в файл PCB. –

+0

Кроме того, в первом примере «linklist» не может быть объявлен вперед, поскольку ссылка или указатель не используются. –

1

Если вам не нужна копия в вашем методе linklist::append вы можете также просто использовать (const) ссылка

void append(const PCB& num); 

и вперед объявить PCB ранее в том же файле заголовка

class PCB; 
+0

Большое спасибо – onegun

-1

Перед тем, как определить другую, вам нужно переслать-объявить каждый класс. В заголовке, который определяет PCB, написать

class linklist; 

перед определением PCB, и в заголовке, который определяет linklist, написать

class PCB; 

перед определением linklist. Таким образом, когда компилятор встречается с каждым из определений классов, он будет знать, что имя «другого» класса действительно и позволяет вам указывать на него указатели, хотя он еще не полностью определен.

Edit: К сожалению, я только что заметил, что ваша linklist::append функции фактически принимает PCB экземпляра, а не указатель. В этом случае вам необходимо убедиться, что класс PCB определен до linklist, но вам все равно нужно переслать linklist до PCB, чтобы вы могли сделать указатели на него. Порядок код должен быть:

class linklist; 

class PCB { 
    // involves pointers to linklist 
; 

class linklist { 
    // holds instances of PCB 
}; 

Редактировать снова: я 'неправильно ваш **linklist list как указатель на linklist (хотя это синтаксически неправильно).

Что вам нужно сделать, это:

  • Прогнозные объявить PCB так, что определение linklist может относиться к нему в подписи метода.
  • Определить класс linklist, но не его append функция еще.
  • Определите класс PCB, который может содержать экземпляр linklist, поскольку этот класс теперь полностью определен.
  • Определите функцию linklist::append(), которая может принимать экземпляр PCB, поскольку этот класс теперь полностью определен.

Это будет ваш код для компиляции, но он не будет делать то, что вы, вероятно, хотите, потому что способ, которым вы определили свои классы, не имеет большого смысла. Ваш класс PCB не ссылается на список, он содержит в себе список. Так как переменная-член list не указатель, каждый PCB экземпляр содержит целые linklist. Когда вы append() a PCB до linklist, вы делаете копию этого целого PCB, включая (0) linklist, который он содержит.

У меня такое чувство, что вы приходят с Java или C#, и вы предполагаете, что это ссылки, когда они на самом деле нет. Вам нужно узнать, как использовать указатели.

+0

Вы не сможете объявить полную 'PCB', если все, что у вас есть, - это декларация. Они помогают только для указателей или ссылок на «PCB's». –

+0

@honk, да, я тоже это заметил и отредактировал свой ответ. :-) – Wyzard

+0

благодарит всех за то, что вы даете вперед предложение объявить, так как я могу выбрать только один правильный ответ, я передам его первому, предложите ответ, спасибо большое – onegun

0

Вы могли бы сделать опережающее объявление на одном из типов, но вы действительно должны спросить себя, почему вы делаете это.

Я не могу придумать, когда это будет хорошей идеей. Если вы думаете о своей проблеме относительно реального мира, это список ведер. То, о чем вы просите, - это ведро (PCB), чтобы удерживать серию (список ссылок) ведер (PCB). На самом деле это никогда не будет работать, так как ведро не может содержать коллекцию других ведер одинакового размера.

Другие думают, спросите себя, почему бы вам использовать список ссылок, когда STL (стандартная библиотека шаблонов) предоставляет все, что вам нужно, и еще больше. Я бы очень рекомендовал вектор, если список печатных плат довольно статичен, или список, если нет.

Связанные списки могут быть очень эффективными для легких контейнеров, но вы должны их поддерживать. Если вы используете классы, используйте GO STL контейнеры.

+0

Я возьму ваше предложение. я думаю, что могу перепроверить мой код и попытаться улучшить – onegun

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