使所有类方法调用相同的函数

时间:2015-04-19 21:52:32

标签: c++ logging methods function-calls

所以,我有这种情况:

#include "ActionLog.h"
class Library{
        ActionLog aLog;
        // ... the rest of it is private, mind you :D
    public:
        Library(...);
        void addBook(...);
        void removeBook(...);
        // ... aaand there's a whole bunch of these :)
    };

现在,class ActionLog有一个公共方法void log(...);。一旦实施,它应该记录作为class Library的方法列出的任何活动的开始(并最终成功/失败,这是可选的)。

我想知道这个:是否有一些更优雅的方法让每个class Library的方法在开始执行时/之前调用aLog.log(...);方法? “优雅”我的意思不仅仅是在每一种方法中明确地称它......

知道类似问题的Python version of the solution,但我不熟悉Python,所以我甚至不确定相同的类相关原则是否适用。

2 个答案:

答案 0 :(得分:2)

C ++没有任何内置的反射方法。无论是在运行时还是在编译时都无法列出方法。您可以做的最好的事情是将日志记录隐藏到用于定义每个方法的某些#define中,但预处理器用法是现代C ++中的反模式。

坚持目前的做法。

答案 1 :(得分:1)

正如polkovnikov.ph所说,没有反思,你将无法使用蟒蛇的方法。

为了好玩,我将把它留在这里,但我不建议使用它:

#include <iostream>    

class Logger
{
    public:
        void log(std::string entry)
        {
            std::cout << entry << std::endl;
        }
};    

class A
{
    Logger mylog;
    public:
        void foo()
        {
            std::cout << "Doing foo" << std::endl;
        }    

        Logger& getLogger()
        {
            return mylog;
        }
};    

#define CALL_FUNC_AND_LOG(obj,func) \
    { obj.getLogger().log("Logging "#func); obj.func(); }    

int main()
{
    A a;
    CALL_FUNC_AND_LOG(a,foo);
    return 0;
}

http://ideone.com/q0VHj6

或另一个自动记录方法范围结束的版本。

#include <iostream>    

class Logger
{
    std::string _entry;
    public:
        Logger(std::string entry)
        {
            _entry = entry;
            std::cout << "Starting execution of " << entry << std::endl;
        }    

        ~Logger()
        {
            std::cout << "Ending execution of " << _entry << std::endl;
        }
};    

class A
{
    public:
        void foo()
        {
            std::cout << "Doing foo" << std::endl;
        }
};    

#define CALL_FUNC_AND_LOG(obj,func) \
    { \
        Logger _mylogger(""#func); \
        obj.func(); \
        \
    }

int main()
{
    A a;
    CALL_FUNC_AND_LOG(a,foo);
    return 0;
}

http://ideone.com/DHf3xu