Я создал статическую библиотеку для следующего класса, libtgbotengine.a
и extern
отредактировал класс, который будет использоваться в другом проекте.
tgbotengine.h
#include <tgbot/tgbot.h>
// Other headers
// ...
class TgBotEngine{
public:
// Class constructors and functions
// ...
void start();
private:
TgBot::Bot m_bot;
std::vector<TgBot::BotCommand::Ptr> m_commands;
// Other members
// ...
}
extern TgBotEngine myTgBotEngine;
В другом проекте я хочу связать libtgbotengine.a
со следующим файлом cpp. Моя цель - не включать tgbotengine.h
. Помогает ли мне в этом extern
ing myTgBotEngine
?
project2.cpp
int main(){
myTgBotEngine.start();
return 0;
}
2 ответа
Предстоящие модули, вероятно, позволят вам делать то, что вы хотите. К сожалению, они все еще экспериментальные ...
Единственный известный мне переносимый способ полностью скрыть детали реализации - разделить ваш класс между общедоступным интерфейсом и частной реализацией. Это обычное дело для разработчиков Java.
Вот это будет выглядеть так:
Интерфейсная часть:
Заголовок
// Other headers // ... class TgBotEngine { public: // public functions // ... virtual void start() = 0; static std::unique_ptr<TgBotEngine> build(/*ctor parameters*/); }
Источник:
#include <tgbot/tgbotimpl.h> #include <tgbot/tgbot.h> std::unique_ptr<TgBotEngine> TgBotEngine::build(/*ctor parameters*/) { return std::make_unique<TgBotEngineImpl>(/*ctor parameters*/); }
Реализационная часть
#include <tgbot/tgbot.h> // Other headers // ... class TgBotEngineImpl: public TgBotEngine { public: // Class constructors and functions // ... void start(); private: TgBot::Bot m_bot; std::vector<TgBot::BotCommand::Ptr> m_commands; // Other members // ... }
Затем вы можете использовать его так:
#include "tgb.h"
#include <memory>
int main() {
std::unique_ptr<TgBotEngine> engine = TgBotEngine::build(/* ctor parameters*/);
engine->start();
...
}
ИМХО: То, что вы хотите делать, невозможно.
Заголовочный файл вашей библиотеки похож на чертеж вашего класса.
Давайте расширим пример TgBotEngine:
class TgBotEngine{
public:
// ...
virtual void someMethod() = 0; // for this example this is the first method
virtual void start() = 0; // for this example this is the second method
virtual void anotherMethod() = 0; // for this example this is the third method
// ...
}
Предположим, что TgBotEngine
- чистый виртуальный класс. Что компилятор не знает, пока вы не предоставите файл заголовка :)
И призыв к нему такой:
void callBot(TgBotEngine& tge)
{
tge.start();
}
Что делает компилятор с этой строкой: tge.start();
- это вызвать второй метод TgBotEngine, который будет иметь индекс 1. Изобразите его как этот псевдокод: myTgBotEngine.[1]()
Чтобы определить положение вашего метода в классе, вам необходимо предоставить файл заголовка.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .