C ++ использует включенный класс из заголовка под другим идентификатором - PullRequest
4 голосов
/ 28 января 2020

Я сталкиваюсь с проблемой, когда объявленное имя класса из включенного (внешнего) заголовочного файла сталкивается с объявленным именем класса моего собственного заголовочного файла. Но в основном я хочу составить свой класс с включенным классом. В Golang решением было бы использование функции под названием Декларации импорта .

  • Как этого добиться:

    • без переименовать мою собственную декларацию (или изменить потребителей моей собственной декларации)?
    • и без использования наследования (предпочтение композиции вместо наследования)?
    • и без изменения внешнего кода?
  • И какова правильная терминология для этого?

Я искал уже несколько тем и форумов, но не могу придумать решение. То, что я пытался до сих пор (и что можно увидеть в коде ниже), это окружить включенный заголовок пользовательским пространством имен. Но это приводит к неприятным проблемам с линковкой (см. Ниже), когда я обращаюсь к методам включенного класса. Я немного новичок в C ++, поэтому я был бы очень рад получить подробные объяснения о том, как этого добиться.

Файл внешнего заголовка ("some / sensor.h"):

class Sensor {
 public:
  Sensor(unsigned char a, unsigned char b);
 /*some definitions...*/
};

Моя декларация ("sensor.h"):

namespace Lib {
#include "some/sensor.h"
};

class Sensor {
 private:
  Lib::Sensor s; /* use foreign object as member */
 public:
  Sensor();
  void init(unsigned char p);
};

Получение ошибок, таких как:

In function `Sensor::init(unsigned char)':
  undefined reference to `Lib::Sensor::Sensor(unsigned char, unsigned char)'
  /* ...and so on... */
collect2: error: ld returned 1 exit status

1 Ответ

4 голосов
/ 28 января 2020

[Примечание] Для будущих читателей:

Пожалуйста, просмотрите комментарии, так как они лучше отражают полную картину ответа. Следующий ответ @ Baruch поможет вам быстро исправить ситуацию. Но, как предлагается в комментариях, это может быть плохим выбором дизайна авторами внешней библиотеки.

Оригинальный ответ @Baruch:

Вы должны поместить свой код в Пространство имен, а не внешний код Класс, определенный в some/sensor.cpp, равен Sensor, а не Lib::Sensor

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