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