0

その他の C++ 学習に関する質問。私は主に生のポインターでベクトルを使用してある程度の成功を収めてきましたが、代わりに値オブジェクトを使用して遊んでみました。私が直面している最初の問題は、一般的なコンパイル エラーです。以下のコードをコンパイルするとエラーが発生します。

class FileReference {

    public:
        FileReference(const char* path) : path(string(path)) {};
        const std::string path;

};

int main(...) {

    std::vector<FileReference>  files;

    // error C2582: 'operator =' function is unavailable in 'FileReference'
    files.push_back(FileReference("d:\\blah\\blah\\blah"));

}

Q1: どういうわけか const パスを指定したり、代入演算子を定義していないことが原因だと思います - デフォルトの演算子が機能しないのはなぜですか? ここでオブジェクトに const を定義しても、const パスを定義したためだと思いますが、const はここで何かを勝ち取りますか?

Q2: 次に、これらの値オブジェクトのベクトルでは、オブジェクトはメモリセーフですか? (つまり、それらは自動的に削除されますか)。ここでは、デフォルトでベクトルがヒープに割り当てられることを読みました。これは、何かを「削除」する必要があることを意味します。

Q3: 第 3 に、ベクター全体のコピーを防ぐために、次のようにベクターを参照として渡すパラメーターを作成する必要があります。

// static
FileReference::Query(const FileReference& reference, std::vector<FileReference>& files) {
    // push stuff into the passed in vector
}

関数が終了したときに終了したくない大きなオブジェクトを返すための標準は何ですか。ここで shared_ptr などを使用するとメリットがありますか?

4

2 に答える 2

5
  1. メンバー変数がconstの場合、既定の代入演算子は作成できません。コンパイラは、あなたが何をしたいのかを知りません。独自の演算子のオーバーロードを作成し、必要な動作を把握する必要があります。(このため、constメンバー変数は、最初に考えたよりも役に立たないことがよくあります。)

  2. 生のメモリやその他のリソースの所有権を取得していない限り、クリーンアップする必要はありません。Astd::vectorは、自身のリソースを常に正しくクリーンアップする限り、その有効期間が終了すると、含まれている要素を常に正しく削除します。そして、あなたの場合、唯一のメンバー変数は astd:stringであり、それ自体も処理します。だからあなたは完全に安全です。

  3. 共有ポインターを使用することもできますが、プロファイリングを行ってここでボトルネックを特定しない限り、私はそれについて心配する必要はありません。特に、多くの状況でコンパイラが実行できるcopy elisionについて読む必要があります。

于 2012-06-26T17:04:38.573 に答える
3

の要素は、C++ 標準のセクション 23.2.4 クラス テンプレート ベクトルvectorから割り当て可能でなければなりません。

...格納されたオブジェクトは、Assignable の要件を満たす必要があります。

メンバーを持つconstと、クラスは割り当てられなくなります。

要素は値によって格納されているため、ベクターが破棄されるか、ベクターから削除されると破棄されます。要素が生のポインターである場合は、明示的にdeleted にする必要があります。

于 2012-06-26T17:05:50.383 に答える