インターフェイスを使用して、非常にモジュール化されたプログラムを作成しようとしています。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
コンパイル エラー:
ありがとう - フランシスコ