5

私はいくつかのクラスFooとLoggerを持っています:

class Logger{/* something goes here */};
class Foo{
  Foo(Logger& logger);
  Logger& logger;
}

Foo::Foo(Logger& logger) : logger(logger)
{}

次に、クラスFooのオブジェクトの配列を作成します。ここで、すべての参照Foo::loggerは同じLoggerオブジェクトを指す必要があります。私は次のようなことを試しました(スタックとヒープの両方の割り当てが必要です):

Logger log (/* parameters */);
Foo objects [3] (log); // On stack
Foo* pObjects = new Foo [3] (log); // On heap

問題は、両方のバージョンが、存在しないデフォルトのコンストラクターを呼び出そうとすることですFoo()。また、私が理解しているように、参照の参照変数を変更することはできません。したがって、デフォルトコンストラクターへの一時的な呼び出しと、その後のループでの初期化も役に立ちません。

だから:それを行う正しい方法は何ですか?Loggerオブジェクトへのポインタを使用する必要がありますか?

4

3 に答える 3

5

デフォルト以外のコンストラクターでオブジェクトの配列を初期化することはできません。ただし、ここに示すようにベクトルを使用できます(最初の返信を見てください)

ヒープについては、次のことができます。

Foo* pObjects[3];

for (int i = 0; i < 3; ++i) {
   pObjects[i] = new Foo(log);
}
于 2012-04-04T13:47:42.037 に答える
2

一般的な用途では、通常、ロガーをシングルトンにして、1 つだけにしてすべてのコンポーネントからアクセスできるようにします。http://en.wikipedia.org/wiki/Singleton_pattern

これにより、Foo のコンストラクターも非常に単純になります。

class Logger
{
    public:
        static Logger& getInstance()
        {
            static Logger    instance;
            return instance;
        }

        public log(const std::string& txt) 
        {
            //do something
        }

    private:
        Logger() {}
        Logger(Logger const&);              // Don't Implement.
        void operator=(Logger const&); // Don't implement
 };

そして、次のように Foo で使用します。

 Logger::getInstance().log("test");

また

 Logger& logger = Logger::getInstance();
 logger.log("test");

(@Loki Astari のシングルトンのクレジット: C++ シングルトン デザイン パターン)

于 2012-04-04T13:59:22.017 に答える
2

C++11 ブレースの初期化を使用して、デフォルト以外のコンストラクターでオブジェクトの配列を初期化できます。

class Logger{/* something goes here */};
class Foo{
public:
  Foo(Logger& logger);
private:
  Logger& logger;
};

Foo::Foo(Logger& logger) : logger(logger)
{}


EDIT:C++ 11では、あなたが望むことをするために使うことができますvector

#include <vector>
class Logger{/* something goes here */};
class Foo{
public:
  Foo(Logger& logger) : logger(logger) {}
private:
  Logger& logger;
};

int main () {
  Logger log;
  std::vector<Foo>(3, log);
}

このvectorソリューションは C++03 では機能しないことに注意してください。C++03 では、そのベクトル コンストラクターはFoo::operator=. C++11 では、 を呼び出しますFoo::Foo(const Foo&)

于 2012-04-04T13:55:14.423 に答える