2017-02-05 8 views
1

私はこの1つの問題を一日中終わらせましたが、誰かがそれを私に説明することができますか?私は私の正確なコードを提供していませんが、私が同行しようとしているもの(と短縮バージョン)の同様の状況。それはレストランのシミュレータです。ポインタへの文字列参照の割り当て

table.cc:9:18: error: cannot convert ‘const string {aka const std::__cxx11::basic_string}’ to ‘std::__cxx11::string* {aka std::__cxx11::basic_string*}’ in assignment this->tableID = tableID;

は、誰もが何が起こっているのかを教えてもらえます:

int main() { 
    Restaurant i; 
    string tableID; 
    cin >> tableID; 
    i.append(new Table(tableID));//this appends a new table to the linked list 
} 
//.h file we're not allowed to modify 
class Table 
{ 
public: 
    Table(const string& tableID);//constructor 
private: 
    string* tableID; 
} 
// .cpp file I'm writing 
Table::Table(const string& tableID){ 
    this->tableID = tableID; 
} 

私はエラーを取得していますか?私にとってはtableIDのアドレスをmain()に渡していて、コンストラクタのポインタに代入しているようですが、それは合法だと思っていましたが、それはconstを投げ捨てています。

+0

エラーメッセージは明らかです。 'string'の型の変数に' string'型の式を代入しようとしています。 'int * p = 42;と同じ理由でうまくいきません。うまくいかず、意味がありません。 –

+0

そうだと思ったけど、どうやってその文字列をポインタに変換するのか分からなかった。 – Mike1982

答えて

1

いくつかのオプションが:

  1. 変更クラスTabletableIDの定義はstring tableIDされるように。この場合、インスタンスの値のコピーを保持します。

  2. this->tableIDへの割り当てをthis->tableID = &tableIDに変更してください。この場合、tableIDのアドレスをthis->tableIDに割り当てます。この場合、インスタンス内のテーブル名へのポインタのみを保持します。これは、面白い動作を引き起こす可能性があります。あなたはおそらくこのアプローチで最大のことを学ぶでしょう。

  3. this->tableId = new string(tableID)に割り当てを変更してください。ここでは、新しいstringを割り当て、パラメータtableIDの値を入力してから、新しい文字列のアドレスをインスタンスvar tableIDに割り当てます。しかし、このクラスのデストラクタが定義されていないので、インスタンスを破棄するたびに割り当てられた文字列がTableにリークされます。

多分上記のいくつかの組み合わせが最適でしょう。

幸運のベスト。

+0

ありがとうございました!ここに私が思いついたものがあります。 – Mike1982

+1

サイドノート: 'this-> tableID = new(std :: nothrow)std :: string(tableID);を使用して、コンストラクタで例外をスローしたくない場合があります。 –

+0

1.私は定義ファイルを私たちに与えたので私は定義を変更することはできません。私たちはそれを変更するとオンラインではコンパイルできません。 2.それは最初に考えられたが、少し違うエラーが出る。 constから基本文字列への変換。それは実際に働いた。 the.hファイルにはデストラクタがあるので、クラスimplementaionにデストラクタを作成するだけでよいはずです。ありがとうございました! – Mike1982

関連する問題