0

オブジェクトの配列を初期化しようとしています:

SinglyLinkedList offeredClasses[22] = {SinglyLinkedList("CSCE101"),SinglyLinkedList("CSCE101L"),SinglyLinkedList("CSCE150E"),SinglyLinkedList("CSCE150EL"),SinglyLinkedList("CSCE150EM"),SinglyLinkedList("CSCE150EML"),SinglyLinkedList("CSCE155"),SinglyLinkedList("CSCE155H"),SinglyLinkedList("CSCE156"),SinglyLinkedList("CSCE230"),SinglyLinkedList("CSCE230L"),SinglyLinkedList("CSCE235"),SinglyLinkedList("CSCE251"),SinglyLinkedList("CSCE310"),SinglyLinkedList("CSCE322"),SinglyLinkedList("CSCE361"),SinglyLinkedList("CSCE351"),SinglyLinkedList("CSCE451"),SinglyLinkedList("CSCE423"),SinglyLinkedList("CSCE428"),SinglyLinkedList("CSCE486"),SinglyLinkedList("CSCE487")};

しかし、これを実行しようとすると、オーバーロードされたコンストラクターではなく、コピーコンストラクターを呼び出そうとし続けます。これを修正するためのアイデアはありますか?

問題の2つのコンストラクターは次のとおりです。

SinglyLinkedList(string course); //Constructor
SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

他のものにはコピーコンストラクタが必要なので、削除できません。

ご協力いただきありがとうございます!

4

5 に答える 5

6

コンパイラが深刻に壊れているようです。コピーコンストラクターは、非定数参照パラメーターで宣言されています。非定数参照を一時オブジェクトにバインドできないため、このようなコピーコンストラクターを一時オブジェクトを引数として呼び出すことはできません。

初期化子は一時的なオブジェクトです。つまり、ここでコピーコンストラクターを呼び出す方法はまったくありません。コンパイラがそれを行う場合、それは壊れているか、奇妙な非準拠の方法で動作するようにする設定のセットを使用していることを意味します。どのコンパイラを使用していますか?

それが答えの最初の部分です。

2番目の部分は、中括弧で囲まれた初期化子リストがC++ではコピー初期化として解釈されることです。つまり、この場合、コピーコンストラクターを呼び出す必要があります。それを回避する方法はありません(呼び出しは後で最適化できますが、どのような場合でもコンストラクターが使用可能である必要があります)。この点で、コンパイラは「正しく」動作しています。つまり、必要に応じてコピーコンストラクタを呼び出そうとします。ただし、上記で述べたように、あなたの場合は、(コピーコンストラクターは呼び出せないため)エラーを発行する必要があります。

そして最後に、答えの3番目の部分。

変換コンストラクターの代わりにコピーコンストラクターが呼び出されると言っています。実際には、両方とも呼ばれます。注意深く見ると、それがわかります。最初に、指定した文字列から「SinglyLinkedList」タイプの中間一時オブジェクトを作成するために変換コンストラクターが呼び出され(一時的な「std :: string」オブジェクトの作成も含まれます)、次にコピーコンストラクターが呼び出されます。一時変数から配列要素を初期化するため(これは配列内の各要素で発生します)。これは、copy-constrcutorが適切に宣言されている、つまりconst参照パラメーターを使用していると仮定した場合のC++での動作です。ただし、非const参照パラメーターを使用すると、コピーコンストラクターを呼び出すことができず、コードの形式が正しくありません。

于 2009-10-12T16:59:49.030 に答える
1

単一の引数がある場合、コンストラクターは常にそれらを宣言しますexplicit

explicit SinglyLinkedList(string course); //Constructor
explicit SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

そうすれば、適切なコンストラクターを呼び出す可能性が高くなります。

一方、コンストラクターコンパイラーが検索しているのはですSinglyLinkedList( const char* )。文字列インスタンスを直接作成してみてください。例:SinglyLinkedList( string("CSCE101") )

于 2009-10-12T17:06:15.757 に答える
0

呼び出しているコンストラクターの署名はSinglyLinkedList(char const *)です。

提供していないので、char const *を取得するconstructotrを生成するか、SinglyLinkedList(string( "CSCE101"))として呼び出します。

char*からstd::stringへの暗黙の変換はありません。そのため、コンパイラはどのオーバーロードが一致するかを確認する必要があり、一致するSinglyLinkedListを検出します。

于 2009-10-12T17:04:37.540 に答える
0

コンストラクター宣言を次のように変更してみてください。

explicit SinglyLinkedList(std::string const& name);
SinglyLinkedList(SinglyLinkedList const& other);

次に、代入演算子とデストラクタを追加します。

~SinglyLinkedList();
SinglyLinkedList& operator=(SinglyLinkedList const& other);

constsがないと、2つのコンストラクターがあいまいになるはずなので、コンパイルしていることに驚いています。

于 2009-10-12T17:06:56.600 に答える
-2

そのISN'Tコピー構築のためにコピーコンストラクターは何が必要ですか?あなたが何か他のもののためにそれを必要とするならば、あなたはその他のものを変える必要があります。現在苦しんでいるような問題を無視しても、コードを理解するのは非常に困難です。これは、外積を行うために演算子^をオーバーロードするなどのことを行うことによって、数学ライブラリで人々が引き起こすのと同じ問題です。

コードを何倍も保守しやすくしながら、それらが使用されることを意図したものを使用し、後の問題を防ぎます。

于 2009-10-12T16:52:27.830 に答える