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 に返すような関数の可能性もあるからなんともいえんけど。
- 07/11/08
17:0217:05
コメント
コメントはありません。