gpt4 book ai didi

c++ - 在 C++ 中实现接口(interface)的问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:32 24 4
gpt4 key购买 nike

我正在尝试使用 C++ 学习设计模式。我正在实现 OReilly 的 Head First Design Patterns 第一章中关于 Duck 问题的程序。请耐心等待,这是一个很长的问题。

无论如何,我已经尝试创建以下 2 个接口(interface):

class QuackBehavior
{
public:
virtual void quack() = 0 ;
};

class FlyBehavior
{
public:
virtual void fly() = 0 ;
};

现在我有一个 Duck 类,它需要具有上述 2 个类的实例。我正在做的是:

class Duck
{
public:
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
Duck()
{

}

virtual void display() = 0 ;
void performQuack()
{
quackBehavior.quack() ;
}

void performFly()
{
flyBehavior.fly() ;
}

void swim()
{
std::cout << "All ducks swim!\n" ;
}
};

我还创建了实现接口(interface)的类:

class Quack: public QuackBehavior
{
void quack()
{
std::cout << "QUACK!\n" ;
}
};

class FlyWithWings: public FlyBehavior
{
void fly()
{
std::cout << "I'm flying...\n" ;
}
};

同样。我创建了一个继承 Duck 类和我的主要方法的类:

class MallardDuck: public Duck
{
public:
MallardDuck()
{
quackBehavior = new Quack() ;
flyBehavior = new FlyWithWings() ;
}

void display()
{
std::cout << "I'm a real duck\n" ;
}
};

int main(int argc, char const *argv[])
{
Duck mallard = new MallardDuck() ;
mallard.performFly() ;
mallard.performQuack() ;
return 0;
}

但是,当我编译程序时,我收到一长串错误。有人可以帮我弄这个吗?提前感谢真正阅读完整问题的人。

最佳答案

FlyBehavior/QuackBehavior 是抽象类,你不能让它们成为 Duck 的成员,你必须使用指针代替(动态多态性通过引用或指针调度):

#include <memory>

class Duck
{
public:
std::unique<FlyBehavior> flyBehavior;
std::unique<QuackBehavior> quackBehavior;
//...
};


MallardDuck() : flyBehavior( new FlyWithWings()), quackBehavior(new Quack())
{ }

由于 FlyBehavior/QuackBehavior 作为抽象类,您应该将它们的析构函数设为虚拟。

class QuackBehavior
{
public:
virtual void quack() = 0 ;
virutal ~QuackBehavior() {}
};

class FlyBehavior
{
public:
virtual void fly() = 0 ;
virtual ~FlyBehavior() {}
};

关于c++ - 在 C++ 中实现接口(interface)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17939507/

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