0

私はEffective C++を読んでいるので、複数のオブジェクトの構築を防ぐクラスを実装しようとしました(項目4):

#include <iostream>
using namespace std;


class testType
{
    public: 
        testType()
        {
            std::cout << "TestType Ctor called." << std::endl;
        }
};

template <typename T, class C>
class boolWrapper 
{
    public: 
        boolWrapper()
            // Shouldn't T() be called here in the initialization list, before the
            // body of the boolWrapper? 
        {
            if (C::exists)
            {
                std::cout << "Oh, it exists." << endl;
            }
            else 
            {
                std::cout << "Hey, it doesn't exist." << endl;
                C::exists = true;
                T();
            }
        }

};

template<class T>
class singleton
{
    private: 
        static bool exists;
        boolWrapper<T, singleton> data_;

    public:
        singleton()
            :
                data_()
        {
        };

        friend class boolWrapper<T, singleton>;
};
template <class T>
bool singleton<T>::exists = false;


int main(int argc, const char *argv[])
{
    singleton<testType> s;

    singleton<testType> q;

    singleton<testType> r;

    return 0;
}

boolWrapper の T() 構造が boolWrapper コンストラクターの本体の前に呼び出されないのはなぜですか? boolWrapper には T 型のデータ メンバーがなく、T から継承されない (親 ctor が暗黙的に呼び出されない) ためですか?

また、解決策をグーグルで検索せずにこれをコーディングしましたが、設計上のエラーはありましたか?

4

1 に答える 1

1

投稿したコードの問題は、boolWrapper に T 型のデータ メンバーがないことです。クラス コンストラクター内では、基本クラスとデータ メンバーに対してコンストラクター (既定のもの) が呼び出されます (明示的なコンストラクターが初期化リストに記載されていない場合)。

于 2012-05-11T09:50:52.157 に答える