I have created a static library for the following class, libtgbotengine.a
and extern
ed the class to be used in a different project.
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;
In a different project, I want to link libtgbotengine.a
with the following cpp file. My goal is to not to include tgbotengine.h
. Is extern
ing myTgBotEngine
help me achieve this?
project2.cpp
int main(){
myTgBotEngine.start();
return 0;
}
The upcoming modules will probably allow what you want to do. Unfortunately, they are still experimental...
The only portable way I know to fully hide the implementation details is to split your class between a public interface and a private implementation. This is common to Java developpers.
Here it would look like:
The interface part:
The header
// Other headers
// ...
class TgBotEngine {
public:
// public functions
// ...
virtual void start() = 0;
static std::unique_ptr<TgBotEngine> build(/*ctor parameters*/);
}
Source:
#include <tgbot/tgbotimpl.h>
#include <tgbot/tgbot.h>
std::unique_ptr<TgBotEngine> TgBotEngine::build(/*ctor parameters*/) {
return std::make_unique<TgBotEngineImpl>(/*ctor parameters*/);
}
The implementation part
#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
// ...
}
You can then use it that way:
#include "tgb.h"
#include <memory>
int main() {
std::unique_ptr<TgBotEngine> engine = TgBotEngine::build(/* ctor parameters*/);
engine->start();
...
}