具有相同方法的静态和非静态版本是否不好设计

时间:2019-06-08 20:57:53

标签: c++ design-patterns

我面临的问题与记录器库有关。我可以创建自己的记录器,但同时,我希望能够使用“默认”或“全局”记录器。

因此,我认为记录器类的某些方法应该具有静态版本,这些静态版本将处理此“默认”记录器。最终在设计方面感到不对。

这是我想做的事的一个例子

std::shared_ptr<lwlog::logger> core_logger = std::make_shared<lwlog::logger>("LOGGER");  //creating some custom logger
core_logger->critical("A very critical message!"); //logging from some custom logger

lwlog::logger::critical("A very critical message!"); //logging from default logger

我的方法的静态和非静态版本的示例:

class LWLOG logger
{
public:
    explicit logger(const std::string& name);
    ~logger();

    void set_name(const std::string& loggerName);
    void set_logLevel_visibility(log_level logLevel);
    void set_pattern(const std::string& pattern);

    void info(const std::string& message);
    void warning(const std::string& message);
    void error(const std::string& message);
    void critical(const std::string& message);
    void debug(const std::string& message);

    static void info(const std::string& message);
    static void warning(const std::string& message);
    static void error(const std::string& message);
    static void critical(const std::string& message);
    static void debug(const std::string& message);
};

1 个答案:

答案 0 :(得分:5)

是的,那将非常令人困惑。

类中的成员函数执行任务。该任务由函数的名称以及(在某种程度上)是否为static来描述。具有两个名称相同但功能不同的static来执行两种不同操作的两个成员函数是完全不可用的。

标准委员会也知道这一点,这就是your proposed solution won't compile的原因。

如果您的用户想要使用其他类型的记录器,则可以随时使用不同实例来使用。

您可以在名称空间中提供一个即时实例,以便用户可以这样做:

lwlog::default_logger->critical("Using the default logger for this one");