から継承できるDice
実際のサイコロとテンプレートクラスの動作を模倣する小さなクラスを作成Singleton
しました。Dice
私はoperator<<
クラスのために書いたDice
が、どういうわけかコンパイラはそれを見つけるのに問題がある。<<
の演算子をオーバーロードしましたが、Dice
これはいくつかのメソッドから返され、持っていると便利です。Sinlgeton<Dice>
std::vector<int>
Dice
私はubuntuで使用Qt creator 2.5
します。gcc 4.7
/home/USER/programming/cpp_yahtzee/main.cpp:12:エラー:'std :: operator <<>((*&std :: cout)、((const char *)の'operator<<'に一致しません"hello"))<<(&Singleton :: Instance())-> Dice :: getLastThrow()'</ p>
これは、このエラーを生成するコードです:
std::cout << "hello" << Dice::Instance().getLastThrow();
編集
それでも、これはまったくエラーなしで期待されたものを出力します:
std::cout << Dice::Instance()
多分それは私のコンパイラの問題ですgcc/g++ 4.7
(試しgcc/g++ 4.6.3
てみましたが効果は同じです)?
私のsinlgetonクラス
template <typename T>
class Singleton
{
public:
static T& Instance();
Singleton() {}
private:
//declare them to prevent copies
Singleton(Singleton const&);
void operator=(Singleton const&);
};
template<typename T>
T& Singleton<T>::Instance()
{
static T _instance;
return _instance;
}
サイコロクラス:
class Dice : public Singleton<Dice>
{
private:
std::vector<int> _lastThrow;
public:
Dice();
std::vector<int> generateThrow();
friend std::ostream& operator<<(std::ostream& os, const Dice& dice);
friend std::ostream& operator<<(std::ostream& os, const Singleton<Dice>& dice);
friend std::ostream& operator<<(std::ostream& os, const std::vector<int>& vect);
//accessor method - returning last throw
const std::vector<int>& getLastThrow();
//rethrowing {1,4} - dice #1 and #4
std::vector<int> Rethrow(const std::vector<int>& objects);
};
std::ostream& operator<<(std::ostream& os, const Dice& dice)
{
for (std::vector<int>::const_iterator it = dice._lastThrow.begin(); it != dice._lastThrow.end(); ++it) {
os << *it;
}
return os;
}
std::ostream& operator<<(std::ostream& os, const Singleton<Dice>& dice)
{
for (std::vector<int>::const_iterator it = dice.Instance().getLastThrow().begin(); it != dice.Instance().getLastThrow().end(); ++it) {
os << *it;
}
return os;
}
std::ostream& operator<<(std::ostream& os, const std::vector<int>& vect)
{
for (std::vector<int>::const_iterator it = vect.begin(); it != vect.end(); ++it) {
os << *it;
}
return os;
}
std::vector<int> Dice::generateThrow()
{
static std::vector<int> v(5);
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
(*it) = rand()%(DICE_MAX)+1;
}
_lastThrow = v;
return v;
}
今、私はこのようなことをすることはできません:
std::cout << Dice::Instance().generateThrow();
編集
IlyaLavrenovのメソッドは機能していますが、ローカル変数を作成する必要があるため、これは私が望むものではありません。Singleton
クラスのどこかに問題があります。