Передача указателя в статическую библиотеку для использования во всех классах?
Как правильно принять указатель на класс, который впоследствии используется в статической библиотеке для всех объектов в этой библиотеке?
Классический случай - регистратор, который я буду использовать в качестве примера здесь.
Синглтоны часто используются при работе с регистраторами. Это нормально, если он полностью определен в статической библиотеке. Тем не менее, как правильно обращаться с ним, когда регистратор находится за пределами библиотеки? Как вы можете передать экземпляр, но использоваться всеми классами в библиотеке?
Тогда используйте D, вы говорите? Ну, в моем случае я не могу использовать DI, потому что некоторые объекты создаются вне библиотеки.
Итак, каков правильный шаблон?
Вот некоторый код, который иллюстрирует концепцию того, что я пытаюсь выполнить:
#include <string>
#include <vector>
#include <memory>
#include <iostream>
//=====================================================
// Logger Libraray
//=====================================================
class Logger {
public:
void Write( std::string message ) {
std::cout << message.c_str() << std::endl;
};
};
//=====================================================
// Internal Libraray
//=====================================================
class Base {
public:
Base() {};
void SetLogger( std::shared_ptr<Logger> logger ) {
logger_ = logger;
};
void Log( std::string message ) {
if( logger_ != nullptr )
logger_->Write( message );
};
private:
static std::shared_ptr<Logger> logger_;
};
class DerivedA : public Base {
public:
DerivedA() {
Log("In derived A");
}
};
class DerivedB : public Base {
public:
DerivedB() {
Log("In derived B");
}
};
//=====================================================
// Library External Interface
//=====================================================
class Item : public Base {
public:
std::string Name;
Item() {
Log( "Item created externally" );
};
};
class Library : public Base {
public:
Library() {};
std::vector<Item> ItemList;
void AssignLog( std::shared_ptr<Logger> logger ) {
SetLogger( logger );
};
void process( ) {
DerivedA a;
DerivedB b;
}
};
//=====================================================
// External Program
//=====================================================
int main() {
Logger log;
log.Write("test");
Library lib;
lib.AssignLog( std::make_shared<Logger>(log));
lib.process();
Item item;
item.Name = "Sample";
lib.ItemList.push_back(item);
}