Я пытаюсь создать очень модульную программу с использованием интерфейсов. Исходя из фона C#, я бы использовал интерфейсы как типы переменных, поэтому я мог использовать полиморфизм, позволяя мне/другим передавать много разных объектов, которые наследуют этот интерфейс в функцию/переменную. Однако при попытке сделать это на 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
В C++ полиморфизм требует использования указателей (возможно, интеллектуальных указателей) или ссылок. –
Ошибки компиляции нечитабельно малы. Можете ли вы поместить их в виде обычного текста вместо изображения? – PherricOxide
Пожалуйста, разместите фактический код вместо изображений. –