18

このようなプログラムを持つ:

#include <iostream>
#include <string>
using namespace std;
class test
{
public:
    test(std::string s):str(s){};
private:
    std::string str;
};

class test1
{
public:
    test tst_("Hi");
};

int main()
{
    return 1;
}

…実行すると次のようになるのはなぜですか

g ++ main.cpp

main.cpp:16:12: error: expected identifier before string constant
main.cpp:16:12: error: expected ‘,’ or ‘...’ before string constant
4

2 に答える 2

24

tst_宣言した場所を初期化することはできません。static constこれは、プリミティブ型に対してのみ実行できます。代わりに、のコンストラクタが必要になりますclass test1

編集:以下に、私がideone.comで行った実例を示します。私が行ったいくつかの変更に注意してください。まず、コピーを避けるために、のコンストラクターに参照をtest取得させることをお勧めします。次に、プログラムが成功した場合は、すべきではありません(ideoneでランタイムエラーが発生します)。conststringreturn 01return 1

#include <iostream>
#include <string>
using namespace std;
class test
{
public:
    test(const std::string& s):str(s){};
private:
    std::string str;
};
 
class test1
{
public:
    test1() : tst_("Hi") {}
    test tst_;
};
 
int main()
{
    return 0;
}
于 2012-04-07T05:49:28.793 に答える
1

必要なことを行うための別のより単純化された方法があります。ステートメントをからに変更するだけで、test tst_("Hi");機能しtest tst_{"Hi"};ます。以下は変更されたコードであり、期待どおりに機能します。

#include <iostream>
#include <string>
using namespace std;
class test
{
public:
    test(std::string s):str(s){cout<<"str is: "<<s;}
private:
    std::string str;
};

class test1
{
public:
    test tst_{"Hi"};
};

int main()
{   test1 obj;
    return 0;
}

test tst_("Hi");に変更したばかりtest tst_{"Hi"};で、他のすべてはまったく同じであることに注意してください。これが機能することを確認するために、str変数を正しく初期化することを確認するために1つのcoutを追加しました。この1行のソリューションは、(少なくとも私にとっては)よりエレガントで、新しい標準に対応していると思います。

于 2021-02-21T16:23:46.077 に答える