Передача указателя в статическую библиотеку для использования во всех классах?

Как правильно принять указатель на класс, который впоследствии используется в статической библиотеке для всех объектов в этой библиотеке?

Классический случай - регистратор, который я буду использовать в качестве примера здесь.

Синглтоны часто используются при работе с регистраторами. Это нормально, если он полностью определен в статической библиотеке. Тем не менее, как правильно обращаться с ним, когда регистратор находится за пределами библиотеки? Как вы можете передать экземпляр, но использоваться всеми классами в библиотеке?

Тогда используйте 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);
}

0 ответов

Другие вопросы по тегам