Абстрактный базовый класс C ++, вызывающий собственную чистую виртуальную функцию, приводит к «неопределенной ссылке» - PullRequest
0 голосов
/ 26 марта 2012

У меня есть базовый класс:

class Foo {
   public:
       virtual ~Foo() {}
       static void printFoos()
       {
           std::vector<Foo*>::iterator it;
           for(it=fooList.begin();it!=fooList.end();++it)
           {
               std::cout<<"Class: "<<(*it)->getClassName()<<"\n";
           }
       }
       virtual const char* getClassName()=0;
       static std::vector<Foo*> fooList;
};

И несколько производных классов, приведенный пример:

class Bar : public Foo {
    public:
        Bar();
    private:
        const char* getClassName()
        {
            return "Bar";
        }
};

Приведенный выше код дает «неопределенную ссылку на Foo :: getClassName ()», которую я предполагаю, потому что код хочет вызвать Foo :: getClassName (), но как мне заставить его вызывать функцию как виртуальный вызов нормально? И.Е. Как мне заставить его вызывать Bar :: getClassName () из Foo?

РЕДАКТИРОВАТЬ: Забыли наследство чтоли

Ответы [ 3 ]

0 голосов
/ 26 марта 2012

Элементы в fooList должны быть созданы с new, fooList[0] = new Bar(). И Bar должно наследоваться от Foo, как сказал WeaselFox.

0 голосов
/ 26 марта 2012

Есть две вещи, которые не определены:

Bar::Bar() is undefined

-   Bar();
+   Bar() {}

и fooList не определен:

+std::vector<Foo*> Foo::fooList;

Вот исправленная программа:

test.cpp:

#include <vector>
#include <iostream>

class Foo {
   public:
       virtual ~Foo() {}
       static void printFoos()
       {
           std::vector<Foo*>::iterator it;
           for(it=fooList.begin();it!=fooList.end();++it)
           {
               std::cout<<"Class: "<<(*it)->getClassName()<<"\n";
           }
       }
       virtual const char* getClassName()=0;
       static std::vector<Foo*> fooList;
};

std::vector<Foo*> Foo::fooList;

class Bar : public Foo {
    public:
        Bar() {};
    private:
        const char* getClassName()
        {
            return "Bar";
        }
};

int main()
{
    //intentionally leaked
    Foo::fooList.push_back(new Bar());
    Foo::fooList.push_back(new Bar());
    Foo::fooList.push_back(new Bar());

    Foo::printFoos();
}

выход:

Class: Bar
Class: Bar
Class: Bar
0 голосов
/ 26 марта 2012

Кажется, bar не наследует foo. Вам необходимо объявить наследство:

class bar: public foo { ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...