fetus Diary

2007/11/08(木) - センスなし

オブジェクト指向におけるFizzBuzz問題
...ちゅーのを考えてみた。
【問題】
class Program {
public static void Main() {
Animal animal;
animal = new Dog();
animal.Sound();
animal.SetCount(3);
animal.Sound();
animal = new Cat();
animal.Sound();
}
}
上記のプログラムを実行した結果が
わん
わんわんわん
にゃー
となるように Animal, Cat, Dog を実装しなさい。
#include <iostream>
#include <memory>
#include <cassert>

class Animal {
public:
    Animal() : m_sound_count(1) { }
    virtual ~Animal() { }

    virtual void Sound() const {
        for(size_t i = 0; i < m_sound_count; ++i) {
            std::cout << SoundOnce();
        }
        std::cout << std::endl;
    }

    virtual void SetCount(size_t count) {
        assert(count > 0);
        m_sound_count = count;
    }
protected:
    virtual std::string SoundOnce() const = 0;

private:
    size_t m_sound_count;
};

class Dog : public Animal {
protected:
    virtual std::string SoundOnce() const { return "わん"; }
};

class Cat : public Animal {
protected:
    virtual std::string SoundOnce() const { return "にゃー"; }
};

int main(int, char**) {
    std::auto_ptr<Animal> animal(new Dog());
    animal->Sound();
    animal->SetCount(3);
    animal->Sound();

    animal.reset(new Cat());
    animal->Sound();
}
[fetus@CHIHAYA ~]$ g++ -Wall -o animal animal.cpp
[fetus@CHIHAYA ~]$ ./animal
わん
わんわんわん
にゃー

…おもしろい回答が思い浮かばない orz

# 効率無視したので、std::string 直接。const 関数なので、呼び出し側でキャッシュしてもいいかもねぇ~。

# SoundOnce は、複数から random に返すような関数の可能性もあるからなんともいえんけど。

コメント

コメントはありません。

名前
メール
コメント

※HTML タグは使えません。HTTP URL には自動リンクが張られます。

Captcha
画像から読み取れる文字を入力: