5

そのようなクラスがあります。文字列の参照を使用したいのですが、機能しません。string& を使用するにはどうすればよいですか?

#include <string>
using namespace std;
class T
{
public:
    T(string& s);
private:
    string s;
};

T::T(string& s)
{
    this->s = s;
}
int main(void)
{
    T t("Test Object");
    return 0;
}

エラー: 'T::T(std::string &)': パラメーター 1 を 'const char [12]' から 'std::string &' に変換できません

4

5 に答える 5

6

使用const

class T
{
public:
    T(const string& ss);
private:
    string s;
};

T::T(const string& ss) : s(ss)
{
}

"Test Object"const stringのコンストラクタに渡す前にとして構築されるTため、コンストラクタは。を受け入れる必要がありconst stringます。

于 2013-03-12T11:59:19.030 に答える
2

std::stringを渡していない。それが言うように、それはconstchar配列からstring-refに変換することはできません。const-refを取得するようにコンストラクターを変更すると、機能します。これは、一時的な文字列をchar-arrayから作成する必要があり、混乱を防ぐために一時的なものに対してのみconst-referencesを作成できるためです(一時的な文字列を変更すると、変更は破棄されるため、言語はあなたがそれをするのを止めます)。

于 2013-03-12T12:00:19.060 に答える
2

C++98/03では、コピーするのが安価ではないクラスがある場合(たとえば、 anintまたは adoubleはコピーするのが安価ですが、astd::stringはそうではありません。そのコピーには新しいヒープ メモリの割り当て、ソースから宛先への文字のコピーが含まれる可能性があるため)など)、ルールはconst参照 const std::string&渡しです:

class T
{
public:
    T(const string& s); // <--- const string&
private:
    string m_s;
};

そして、コンストラクターで次のようにします。

T::T(const string& s)
   : m_s(s)
{}

ただし、移動セマンティクス利用可能なC++11では、新しいルールは次のようになります :

T::T(string s)             // pass by value
   : m_s( std::move(s) )   // and move from the value
{}

(最適な方法は、const &値渡しと値渡しという 2 つのオーバーロードを提供することですが、これは必ずしもすべてのアプリケーションで必要なわけではなく、パフォーマンスを圧迫する必要がある場合に限られます。)

コピーが必要なく、パラメータを監視するだけでよい場合は、通常の C++98/03 パス バイconst &ルールが有効であることに注意してください。

于 2013-03-12T12:20:47.913 に答える
1

定義したコンストラクターは、std::string参照によって次のようになります。

T::T(std::string& s)
{
    this->s = s;
}

したがって、最も簡単なことはstd::string、このコンストラクターに渡されるオブジェクトを作成することです。

std::string s("Test Object");
T t(s);

ただし、コンストラクターは渡されるを変更しないため(のデータメンバーのstd::string値を設定するために使用されるだけです)、参照を渡す必要があります。また、データメンバーを作成して後で別の文字列を割り当てるのではなく、初期化リスト内でこのメンバーを直接作成する方がよいでしょう。TconstT::T(const string& s)s

T::T(const std::string& str) : s(str) { }
于 2013-03-12T12:18:00.997 に答える
0

参照は、コンストラクターの初期化リストを使用して初期化する必要があります。コンストラクターを次のように変更します。

T::T(string& s) : s(s)
{
}

さらに、参照を取得できるようにメンバーsを定義します。std::string& s

あいまいさを避けるために s の名前を変更するかもしれません。

SO のこのエントリを参照してください。

于 2013-03-12T11:58:53.070 に答える