1

C ++で静的オブジェクトを初期化するにはどうすればよいですか?私はJavaの静的ブロックのようなものを探しています。

私はこれを試しました:

Foo.hpp

class Foo{
    public:
    static Bar b;
    static String s;
    static Bar setB();
};

Foo.cpp

Bar Foo::b = Foo::setB();
String Foo::s = "something";
Bar Foo::setB()
{
    Bar bb;
    bb.use(s);
    return bb;
}

コンパイルエラーはありませんが、機能していません。

どうもありがとう

4

4 に答える 4

2

あなたのコード:

class Foo{
    public:
    static Bar b;
    static Bar setB();
}

あなたのコメント:

コンパイルエラーはありません

それは正しくありません。セミコロンがないため、コンパイルできません

それが指摘されると、ほとんどの SO 投稿者はコメントで「しかし、それは単なる入力ミスです。修正します」と主張し、すでに投稿された回答を無効にすることでエラーを悪化させます

つまり、コードを投稿するときは、実際のコードをコピーして貼り付けてください。再入力しないでください。コピーアンドペースト。

さて、核心となる質問、上記のコメントの続きですが、

動いていない。

実際のコードに適切なセミコロンがあり、それが定義されているなどと仮定すると、Barその部分も単純に間違っています。

Visual C++ と MingW g++ でテストしたところ、(セミコロンなどを修正すると) 問題なく動作しました。

于 2012-11-13T04:26:16.153 に答える
1

Bar期待値に初期化できるように、引数なしのコンストラクターが必要です。

Foo::setBar()Foo には既にBarインスタンスがあるため、必要ありません。

于 2012-11-13T04:24:24.393 に答える
0

実際に何も初期化しなかったという事実を除いて、あなたの例は機能します:

#include <iostream>

class Foo{
public:
    static int b;
    static int setB();
};

int Foo::b = Foo::setB();
int Foo::setB()
{
    int bb;
    bb = 42;  // Not in your example
    return bb;
}

int main()
{
    std::cout << 42 << std::endl;
}

これは 42 を出力します (Bar の定義を投稿しなかったため、「Bar」を「int」に変更したことに注意してください)。

于 2012-11-13T04:27:57.453 に答える
0

根本原因: クラス定義の末尾にセミコロンがありません。1つ入れると完璧に機能します。

提案: 質問をするたびに、より多くのコード (可能であれば全体) を提供してください。コードを再度入力せずに、コピーして貼り付けてください。

于 2012-11-13T04:48:06.547 に答える