我正在尝试使用interface
类,并且具有以下class
结构:
IBase.h:
#pragma once
class IBase
{
protected:
virtual ~IBase() = default;
public:
virtual void Delete() = 0;
IBase& operator=(const IBase&) = delete;
};
IQuackable.h:
#ifndef IQUACKABLE
#define IQUACKABLE
#include "IBase.h"
#include <iostream>
class IQuackable : public IBase
{
protected:
IQuackable() = default;
~IQuackable() = default;
public:
virtual void Quack() = 0;
static IQuackable* CreateInstance();
};
#endif //
野鸭鸭.h:
#pragma once
#include "IQuackable.h"
class MallardDuck : public IQuackable
{
private:
MallardDuck();
protected:
~MallardDuck();
public:
void Delete() override;
void Quack() override;
friend IQuackable* IQuackable::CreateInstance();
};
野鸭鸭.cpp:
#include "MallardDuck.h"
MallardDuck::MallardDuck() {}
MallardDuck::~MallardDuck() {}
void MallardDuck::Delete() { delete this; }
void MallardDuck::Quack()
{
std::cout << "Quack!\n";
}
IQuackable* IQuackable::CreateInstance()
{
return static_cast<IQuackable*>(new MallardDuck());
}
我还创建了类 RedHeadDuck.h 和 .cpp,其声明和定义与 MallardDuck 相同。
最后,主类代码:
#include "MallardDuck.h"
#include "RedHeadDuck.h"
int main()
{
IQuackable* mallardDuck = MallardDuck::CreateInstance();
IQuackable* redHeadDuck = RedHeadDuck::CreateInstance();
mallardDuck->Quack();
redHeadDuck->Quack();
}
在这里我遇到了两个错误:
LNK2005“公共:静态类 IQuackable * __cdecl IQuackable::CreateInstance(void)”(?CreateInstance@IQuackable@@SAPAV1@XZ) 已在 MallardDuck.obj 中定义”。
LNK1169“找到一个或多个多重定义的符号”。
我发现,问题出在双重定义上,但它是如何解决的呢?
我已经阅读了有关 Header 保护的信息,但据我所知,在这种情况下它无济于事。人们也写了关于内联函数的文章,但我还没有意识到如何在这里使用它。
我能做些什么?