Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止其他编码器绕过我的包装器函数? 我有一个C++类,它处理日志类日志,并且在我自己的类类中实现这个类的实例。因为我需要在类工作日志中添加时间戳,所以我添加了一个包装函数,在发送要写入类日志的字符之前,将当前时间添加到每一行 class ClassWork { public: void doStuff() { ... workLog.writeToLog("test"); } private: ClassWorkLog workLog; };_C++_Class_Oop_Wrapper - Fatal编程技术网

如何防止其他编码器绕过我的包装器函数? 我有一个C++类,它处理日志类日志,并且在我自己的类类中实现这个类的实例。因为我需要在类工作日志中添加时间戳,所以我添加了一个包装函数,在发送要写入类日志的字符之前,将当前时间添加到每一行 class ClassWork { public: void doStuff() { ... workLog.writeToLog("test"); } private: ClassWorkLog workLog; };

如何防止其他编码器绕过我的包装器函数? 我有一个C++类,它处理日志类日志,并且在我自己的类类中实现这个类的实例。因为我需要在类工作日志中添加时间戳,所以我添加了一个包装函数,在发送要写入类日志的字符之前,将当前时间添加到每一行 class ClassWork { public: void doStuff() { ... workLog.writeToLog("test"); } private: ClassWorkLog workLog; };,c++,class,oop,wrapper,C++,Class,Oop,Wrapper,这意味着任何在ClassWork中添加新日志输出的人都必须使用my wrapper函数,否则日志将因缺少时间戳而混乱。但是,ClassLog有一个公共成员函数,允许任何人绕过我的包装器函数,直接写入日志。我是否可以在ClassWork中拥有ClassLog实例,但阻止ClassWork访问ClassLog公共成员函数,除非它们是从我的包装器函数访问的?这将使另一个编码员不可能意外地将日志搞乱 您可以声明包装函数const,并将保存字符串的变量设置为可变变量,以便const函数仍然可以修改它 cl

这意味着任何在ClassWork中添加新日志输出的人都必须使用my wrapper函数,否则日志将因缺少时间戳而混乱。但是,ClassLog有一个公共成员函数,允许任何人绕过我的包装器函数,直接写入日志。我是否可以在ClassWork中拥有ClassLog实例,但阻止ClassWork访问ClassLog公共成员函数,除非它们是从我的包装器函数访问的?这将使另一个编码员不可能意外地将日志搞乱

您可以声明包装函数const,并将保存字符串的变量设置为可变变量,以便const函数仍然可以修改它

class ClassLog {

    mutable std::string log;

    public: 
    const std::string writeToLog(std::string logToWrite) const 
    {
        log = logToWrite;
        return log;
    };
}

class classWork {

    ClassLog logs;

    public: 
    const void wrapper();
}

我能想到的选择:

不要将ClassLog作为类公开。将其作为类工作的实现细节

将ClassLog的相关成员函数设为私有。声明ClassWork是ClassLog的朋友

class ClassWork {
public:
    void doStuff() {
        ...
        workLog.writeToLog("test");
    }

private:
    ClassWorkLog workLog;
};
在ClassLog的成员函数中将时间戳设为必需参数

class ClassWork {
public:
    void doStuff() {
        ...
        workLog.writeToLog("test");
    }

private:
    ClassWorkLog workLog;
};
在ClassLog的成员函数中将时间戳设为可选参数。如果未提供,请使用当前时间计算时间戳,并将其添加到日志中


ClassLog的日志记录方法是虚拟的吗?如果是这样的话,请创建自己的、专门的ClassLog实现;让我们称之为ClassWorkLog。在你的课堂作业中使用它,而不是在课堂日志中。例如:

class ClassLog {
public:
    virtual void writeToLog(std::string message) { ... }
    ...
};

// Implement wrapper class
class ClassWorkLog : ClassLog {
public:
    virtual void writeToLog(std::string message) override {
        std::string timestamp = getTimeStamp();
        ClassLog::writeToLog(timestamp + message);
    }
};
如果它不可扩展,您可以改为使用composition,其中您的包装器类包含一个类日志:

// Implement wrapper class
class ClassWorkLog {
public:
    void writeToLog(std::string message) {
        std::string timestamp = getTimeStamp();
        classLog.writeToLog(timestamp + message);
    }

private:
    ClassLog classLog;
};
现在,在ClassWork中,使用ClassWorkLog包装类而不是标准的ClassLog

class ClassWork {
public:
    void doStuff() {
        ...
        workLog.writeToLog("test");
    }

private:
    ClassWorkLog workLog;
};

从ClassLog派生您自己的日志类,并存储该类的实例或通过构造函数注入它。然后用自己的日志覆盖公共日志功能。理想情况下,日志记录方法应该是虚拟的

#include <iostream>
#include <stdio.h>
#include <time.h>
#include <string>

using namespace std;

class ClassLog
{
    public:
    void Log(string message)
    {
        std::cout << message << std::endl;
    }
};

class DerivedClassLog : public ClassLog
{

    private:
    const std::string currentDateTime() 
    {
        time_t     now = time(0);
        struct tm  tstruct;
        char       buf[80];
        tstruct = *localtime(&now);
        strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);

        return buf;
    }

    public:
    void Log(string message)
    {
        ClassLog::Log(currentDateTime() + " " + message);
    }
};

int main()
{
   DerivedClassLog logger;

   logger.Log("Hello");

   return 0;
}

我不会像其他答案所建议的那样继承和专门化。相反,我将使用一个类日志成员为私有的包装器类

class TimestampedLog
{
public:
    write(std::string msg) {
        log.write(getCurrentTime());
        log.write(msg);
    }
private:
    ClassLog log;
};

class ClassWork
{
public:
    void doSomething() {
        // ...
        log.write("Did something");
    }
private:
    TimestampedLog log;
};

允许您绕过包装器的函数真的必须是公共的吗?不幸的是,我在ClassLog上没有权限,因为它是一个很久以前开发的类,在我的团队使用的代码中随处可见。因此,任何人都可以使用在我的ClassWork中声明的ClassLog实例进行编写。ClassLog本身的实例是私有的,但我担心人们直接使用ClassLog print而不是我的包装器将代码添加到ClassWork中。这将允许ClassWork只访问ClassLog的私有和受保护的成员。我会更新我的答案,提供更多我认为可能有用的信息。const void返回类型?是的,那是错误的。请随意编辑我的代码。我只是想证明一点。