2012-03-28 5 views
-1

私はこの質問を他の場所で尋ねてきましたが、あいまいな答えを得ました。これはnewキーワードの使い方を理解できないためです。C++関数が正常に返されない:文字列デストラクタが呼び出されている

私が取り組んでいるプロジェクトは、C++の学習を始めるのに役立つものですが、Javaの知識から来ています。これは、テキストベースのゲームで最終的に使用する構造体と関数のコレクションです。

私は問題を抱えている機能はgetStats()です。これは構造木材の変数と継承元の構造体の変数の値を返します。

/** 
*Returns information regarding the status of the wood. 
*@param the wood to retrieve. 
*@return A string representing the stats. 
*/ 
string getStats(wood toGet) 
{ 
    string toReturn; 

    //Substruct specific variables. 
    toReturn += "Type: "; 
    toReturn += toGet.type; 
    toReturn += "\nAge: "; 
    toReturn += toGet.age; 

    //Superstruct variables. 
    toReturn += "\nHeight: "; 
    toReturn += toGet.height; 
    toReturn += "\nWidth: "; 
    toReturn += toGet.width; 
    toReturn += "\nWeight: "; 
    toReturn += toGet.weight; 
    toReturn += "\nGeneric name: "; 
    toReturn += toGet.name; 
    toReturn += "\nState of Matter: "; 
    toReturn += toGet.stateOfMatter; 
    toReturn += "\nFlammable: "; 
    toReturn += toGet.flammable; 
    toReturn += "\n"; 

    return toReturn; 
} 

私は今愚かな方法でこれをやっている、私は配列とループでそれを手直ししますが、今のところ、私はこの方法を使用していますことを実現します。彼らはnewを使用するように私に知らせに、他のウェブサイトで、私はそれを尋ねたが、私はこのようにそれを行うとき:

string toReturn = new string; 

それは私にエラーを与える:

conversion from ‘std::string* {aka std::basic_string *}’ to non-scalar type ‘std::string {aka std::basic_string }’ requested

完全なソースはこちらです:http://pastebin.com/UawrwYj7

サンプル実行からの出力は以下のとおりです。

Type: Birch
Age:
Height:
Width:
Weight: d
Generic name:
State of Matter: solid
Flammable:

+8

C++に 'new'を使用する最良の方法はではなく、すべて。言語はそのようには機能しません。 –

+0

注:おそらく 'string getStats()'が必要です(それはオブジェクト指向です)。 btw元のコードの問題点は何ですか?なぜあなたは 'new'を使いたいのですか? –

+2

あなたが持っているコードは完全に便利です。 **新しく**を使う必要は全くありません**。このコードは正しく動作していますか? –

答えて

3

元のバージョンが呼び出されると、文字列が最初に充填され、構築され、そのコピーが返されると、元の文字列(つまりgetStats()のスタックにある)破壊されます。

new string;は、文字列ではなく、文字列オブジェクトにポインタを返し、そう変数は、それがポインタでなければならない保持する - string *stringではありません。しかし、これにはダイナミックなメモリ管理が必要です。この場合、この方法は必要ありません。

要約:C++で何かをするには、まともな本を手に入れて、少なくとも基本的なことを学んでください.C++はJavaとはまったく異なります。

を編集してください:また、機能がうまく機能するように、stringstreamについてお読みください。

4

1)newは必要ありません。 C++はJavaではありません。 C++オブジェクトでは、宣言されたときにオブジェクトが存在します。

2)式w.getStats(w)は冗長です。パラメータとしてwを渡す必要はなく、thisポインタとして暗黙的に渡されます。

3)あなたはこれを行うことはできません。

double x; 
toReturn += x; 

は何std::string operator+= (double)ありません。 C++標準の最新版より前には、書式設定は一般的にstd::stringクラスでは行われませんでした。あなたは演算子<<を使用していること、しかし、

double x; 
toReturn += std::to_string(x); 

私が推薦する:あなたは、最近の十分なコンパイラを持っている場合は、あなたがあなたのheightwidthweightなど、コードを置き換えることができます。これにより、使用方法に応じて、文字列の書式を設定したり、データをファイルに送信したりすることができます。

は、ここにあなたのgetStatsを更新されます

// Untested code 
std::string getStats() 
{ 
    std::ostringstream oss; 
    oss << "Type: " << this->type << "\n"; 
    oss << "Age: " << this->age << "\n"; 
    oss << "Height: " << this->height << "\n"; 
    oss << "Width: " << this->width << "\n"; 
    // and so on 
    return oss.str(); 
} 

その後、あなたはoperator<<を上書きする方法を学ぶとき、代わりにこれを試してみてください。

friend std::ostream& operator<<(std::ostream& os, const wood& w) { 
    os << "Type: " << w.type << "\n"; 
    os << "Age: " << w.age << "\n"; 
    os << "Height: " << w.height << "\n"; 
    os << "Width: " << w.width << "\n"; 
    // and so on 
    return os; 
} 
std::string getStats() { 
    std::ostringstream oss; 
    oss << *this; 
    return oss.str(); 
} 
+0

フォーマットは、 ''ライブラリによって提供されていますが、 'toReturn + = std :: to_string(x);'です。 –

+0

私はあなたが 'ostringstream'を意味すると思います。 – aschepler

+0

@KerrekSBはい、もちろんです。それはC++ 11固有のものですね。私は分で私の答えを更新します。 –

関連する問題