Доступ к защищенному методу из производного класса в другом проекте (C ++) приводит к ошибке компоновщика - PullRequest
1 голос
/ 10 февраля 2010

Я занимаюсь разработкой на родном C ++, использую Visual Studio.


У меня есть один проект, который содержит инфраструктуры - базовые классы, из которых я хочу получить классы в других проектах в том же решении. Скажем, у меня есть базовый класс в проекте инфраструктуры:

файл base.h:

class Base
{
      public:
          void Foo();
      protected: 
       void Bar();
};

и в другом проекте, классе, производном от A, попробуйте вызвать метод bar:

файл производного.h:

class Derived : Base
{
    public:
     void DoSomething();
};

файл производный.cpp:

void Derived::DoSomething()
{
 Bar();
}

файл main.cpp:

void main()
{
  Derive d;
  d.Foo(); //OK
  d.DoSomething(); // Linker error
}

генерирует следующую ошибку компоновщика:

Ошибка 1, ошибка LNK2001: неразрешенный внешний символ «public: virtual void __thiscall Base :: Bar (void)» (? Bar @ Base @@ UAEXXZ) main.obj CplusplusTestProject

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 10 февраля 2010

Убедитесь, что ваш метод Base :: Bar () где-то реализован. Вы можете просто добавить фигурные скобки после его определения и перестроить свой проект.

1 голос
/ 10 февраля 2010

Самая простая проблема заключается в том, что вы не связываете библиотеку, созданную в другом проекте, с вашим собственным исполняемым файлом.

0 голосов
/ 10 февраля 2010

Вам нужно определение члена Bar. Добавьте определение Bar в определение класса или в отдельный файл base.cpp.

...