0

私はデザイン パターンが初めてで、(Head First Design Patterns) の最初の例を試していますが、C++ でコーディングしようとしています。コードをコンパイルできません。どうしてか分かりません。これが私のコードです。

#include <iostream>
using namespace std;

class QuackBehavior
{
public:
    virtual void quack();
    virtual ~QuackBehavior();
};
class Quack : public QuackBehavior
{
public:
    void quack()
    {
        cout<<"Quacking"<<endl;
    }
};

class MuteQuack : public QuackBehavior
{
public:
    void quack()
    {
        cout<<"<<< Silence >>>"<<endl;
    }
};

class Squeak : public QuackBehavior
{
public:
    void quack()
    {
        cout<<"Squeak"<<endl;
    }
};

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

class FlyWithWings : public FlyBehavior
{
public:
    void fly()
    {
        cout<<"I'm flying"<<endl;
    }
};



class FlyNoWay : public FlyBehavior
{
public:
    void fly()
    {
        cout<<"I can't fly"<<endl;
    }
};

class Duck
{
public:
    FlyBehavior *flyBehavior;
    QuackBehavior *quackBehavior;

    void display();
    void performFly()
    {
        flyBehavior->fly();
    }
    void performQuack()
    {
        quackBehavior->quack();
    }

};

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



int main()
{

    Duck *mallard = new MallardDuck;

    cout<<"Test"<<endl;

    mallard->performFly();
//  mallard->performQuack();

    return 0;
}

ご協力いただきありがとうございます。

4

1 に答える 1

1

クラス QuackBehavior とクラス FlyBehavior の関数に既定の定義を指定していないため、コンパイル エラーが発生します。デフォルトの実装を提供するか、関数を純粋仮想にすることができます。

以下の 2 つの変更を行うと、コードが正常にコンパイルされるはずです。

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

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

また

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

class QuackBehavior
{
  public:
      virtual void quack() = 0;
};
于 2013-03-20T14:15:54.090 に答える