Static-указатель в абстрактном классе

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

22 сен 2008, 19:28

Код: Выделить всё

class Transport
{
        public:
        Transport()
        {}
        ~Transport()
        {}
        static void Print();
        virtual void Show()=0;
        void Add(void);

        private:
        static Transport *pLast; //Указатель на последний элемент в списке объектов
        Transport* pNext;//на следующий после элемента
        static Transport *pHead; //соответственно, на первый

        protected:
        char pName[100];
        static int Count;
};

class Auto :p ublic Transport //Transport---Auto
{
//...
};

class Train :p ublic Transport // Transport---Train
{
//...
};

class Express :p ublic Train
{
//...
};

//остальная всячина

Выдает ошибки:

Код: Выделить всё

  [Linker Error] Unresolved external 'Transport: :p Head' referenced from /*...*/
  [Linker Error] Unresolved external 'Transport: :p Last' referenced from  /*...*/

Как решить эту проблему? Как определить статические указатели? Пробовал присваивать так называемый NULL или 0, все одно и то же!
Alezis
Сообщения: 98
Зарегистрирован: 16 авг 2004, 01:10
Откуда: Минск
Контактная информация:

23 сен 2008, 01:16

Твой код у меня скомпилялся без проблем на VC6.0. Если не определить указатель, то тоже появляются такие же ошибки, т.е. 'Unresolved external'

Код: Выделить всё

Transport* Transport: :p Head = NULL;
Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

14 дек 2008, 17:27

Код: Выделить всё

class Trial
{
        public:
        virtual void Print()=0;
};
Наследниками этого класса являются класс Test и класс Exam (у него еще есть потомок FinalExam). В Test и FinalExam метод Print() переопределяется по-своему.

И бадья обо всех Trial'ских объектах (Test и FinalExam) должна храниться в списке, как я понимаю, таком:

list<Trial*> TrialList;
list<Trial*>::iterator Tx = TrialList.begin();

Так вот у меня проблема такая. Не знаю, как в цикле "пока Tx != TrialList.end()" вызывать функцию Print для объекта Tx??
Юный Падаван
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

14 дек 2008, 20:20

Код: Выделить всё

list<Trial*> TrialList;
list<Trial*>::iterator Tx = TrialList.begin();
for (; Tx != Trial.end(); ++Tx)
{
   Trial* pT = *Tx;
   pT->Print();
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить