gpt4 book ai didi

c++ - 具有不可复制功能的接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:21 25 4
gpt4 key购买 nike

我正在尝试实现一个日志记录工厂,并且我使用了一个接口(interface),以便我可以随时交换记录器。

这是界面

class ILogger
{
public:

//Only allow string input. The entire ARC is going to be non-unicode.
virtual void log(std::string message, eLogLevel level=DEBUG) = 0;

protected:
virtual ~ILogger(void){};


private:
// No one can create an ILogger as it is abstract but should also
// disallow copying... why copy a logger? Only one per file. Besides want to
// force people to use the factory.
/*ILogger(const ILogger&);
ILogger& operator=(const ILogger&);*/ // REMOVED THIS BECAUSE OF ERROR

};

这是一个派生类(头文件)

class GenericLoggerImpl :
public ILogger
{
public:
virtual ~GenericLoggerImpl(void);
virtual void log(std::string message, eLogLevel level=DEBUG);

private:
GenericLoggerImpl(void); //USE THE FACTORY
std::tr1::shared_ptr<GenericLogger> pImpl; //This is the implementation
friend class LoggerFactory; // class LoggerFactory can now build these
};

和CPP

GenericLoggerImpl::GenericLoggerImpl(void):pImpl()
{
pImpl = std::tr1::shared_ptr<GenericLogger> (new GenericLogger()); //This is the implementation
}

GenericLoggerImpl::~GenericLoggerImpl(void)
{
}

void GenericLoggerImpl::log(std::string message, eLogLevel level)
{
pImpl->logMsg(message.c_str(),level);
}

问题来了。在ILogger界面看到我注释掉了一段私有(private)代码?嗯,这是为了阻止任何人复制 ILogger 派生类(就像 boost::noncopyable 那样)。这是有道理的(无论如何对我来说),因为它不允许不同的记录器实例访问同一个文件,并让用户通过我方便的 LoggerFactory。

当包含这些行时,我会收到以下错误:

genericloggerimpl.cpp(6) : error C2512: 'ILogger' : no appropriate default constructor available

那是什么?我不希望这些对象是可复制的。我该怎么做?

最佳答案

任何 用户定义的构造函数(包括复制构造函数)的存在将阻止编译器生成默认构造函数。您的子类 GenericLogger 依赖于 ILogger 的默认构造函数的存在(它被隐式调用,因为在 的构造函数的初始化列表中没有另外指定它code>GenericLogger),因此出现错误。

要解决这个问题,只需为 ILogger 声明一个 protected 普通默认构造函数:

ILogger() {}

关于c++ - 具有不可复制功能的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com