我正在尝试使用接口创建一个非常模块化的程序。来自C#背景,我将接口用作变量类型,因此我可以使用多态,允许自己/其他人将从此接口继承的许多不同对象传递到函数/变量中。 但是,当我尝试在C ++中执行此操作时,我遇到了许多奇怪的错误。我在这里做错了什么?
我希望能够使用接口类型的变量。但是,以下内容会产生编译错误。我认为编译器认为我的ErrorLogger类是抽象的,因为它继承自抽象类或其他东西。
ILogger * errorLogger = ErrorLogger();
error C2440: 'initializing' : cannot convert from 'automation::ErrorLogger' to 'automation::ILogger *'
如果我以错误的方式解决这个问题,即使是在设计方面,我也在学习,并乐意听取任何建议。
ILogger.h:
#ifndef _ILOGGER_H_
#define _ILOGGER_H_
namespace automation
{
class ILogger
{
public:
virtual void Log(const IError &error) = 0;
};
}
#endif
ErrorLogger.h:
#ifndef _ERRORLOGGER_H_
#define _ERRORLOGGER_H_
#include "ILogger.h"
#include "IError.h"
/* Writes unhandled errors to a memory-mapped file.
*
**/
namespace automation
{
class ErrorLogger : public ILogger
{
public:
ErrorLogger(const wchar_t * file = nullptr, const FILE * stream = nullptr);
~ErrorLogger(void);
void Log(const IError &error);
};
}
#endif
ErrorLogger.cpp:
#include "stdafx.h"
#include "ErrorLogger.h"
#include "IError.h"
using namespace automation;
ErrorLogger::ErrorLogger(const wchar_t * file, const FILE * stream)
{
}
void ErrorLogger::Log(const IError &error)
{
wprintf_s(L"ILogger->ErrorLogger.Log()");
}
ErrorLogger::~ErrorLogger(void)
{
}
IError.h:
#ifndef _IERROR_H_
#define _IERROR_H_
namespace automation
{
class IError
{
public:
virtual const wchar_t *GetErrorMessage() = 0;
virtual const int &GetLineNumber() = 0;
};
}
#endif
编译错误:
谢谢, -Francisco
答案 0 :(得分:2)
ILogger * errorLogger = ErrorLogger();
errorLogger
是一个指针,您需要使用new operator
初始化它。
定义指向被解除的类的基指针的正确方法是:
automation::ILogger * errorLogger = new automation::ErrorLogger();
// ^^^^
更好地使用现代C ++中的智能指针:
#include <memory>
std::unique_ptr<automation::ILogger> errorLoggerPtr(new automation::ErrorLogger());
您还需要在IError.h
ILogger.h
#include "IError.h"
其他建议:
1使用 fstream 而不是 FILE 2使用 std :: wstring 而不是 wchar_t * 2在cpp文件中,不要'调用
using namespace automation;
使用命名空间包装函数定义,就像在头文件中所做的那样:
namespace automation
{
ErrorLogger::ErrorLogger(const std::wstring& file, std::ofstream& stream)
{
}
}
关键是不要将C ++代码与C代码混合,C ++类如string,fstream提供RAII,它更安全,更易于使用。
答案 1 :(得分:0)
您需要#include "IError.h"
头文件中的ILogger.h
。