[解決済み] メンバ変数をクラスメンバとして参照する
質問
私の仕事場では、このスタイルが広く使われています。
#include <iostream>
using namespace std;
class A
{
public:
A(int& thing) : m_thing(thing) {}
void printit() { cout << m_thing << endl; }
protected:
const int& m_thing; //usually would be more complex object
};
int main(int argc, char* argv[])
{
int myint = 5;
A myA(myint);
myA.printit();
return 0;
}
このイディオムを説明する名前はあるのでしょうか? 私は、大きな複雑なオブジェクトをコピーする際の大きなオーバーヘッドを防ぐためだと推測しています。
これは一般的に良い習慣でしょうか? このアプローチに落とし穴はありますか?
どのように解決するのですか?
<ブロッククオートこのイディオムを表す名前はあるのでしょうか?
UMLではaggregationと呼ばれています。構成と異なるのは、メンバーオブジェクトが 所有 を参照するクラスが所有しない点です。C++では、参照またはポインタを介して、2つの異なる方法で集約を実装することができます。
私は、大きな複雑なオブジェクトをコピーする際の大きなオーバーヘッドを防ぐためだと推測していますが?
いいえ、それはこれを使用する本当に悪い理由でしょう。集約の主な理由は、含まれるオブジェクトが含むオブジェクトによって所有されておらず、したがって、それらの寿命が束縛されていないことです。特に、参照されるオブジェクトの寿命は、参照するオブジェクトよりも長くなければなりません。それはずっと前に作成されたかもしれないし、コンテナの寿命の終わりを越えて生きているかもしれない。さらに、参照されるオブジェクトの状態は、クラスによって制御されるのではなく、外部から変更される可能性があります。もし参照先が
const
でない場合、クラスはその外側に住んでいるオブジェクトの状態を変更することができます。
これは一般的に良い方法でしょうか?このアプローチには何か落とし穴がありますか?
これはデザインツールです。ある場合には良いアイデアとなり、ある場合にはそうではありません。最も一般的な落とし穴は、参照を保持するオブジェクトの寿命が、参照されるオブジェクトの寿命を決して超えないようにすることです。もし、囲んでいるオブジェクトが参照 の後に の後に参照を使用した場合、未定義の動作をすることになります。一般的には集約よりも合成を優先した方が良いのですが、必要であれば他のツールに劣らず良いものです。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] 配置されたアセンブリのマニフェスト定義がアセンブリ参照と一致しない
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] MongoDBのリレーションシップ:埋め込みか参照か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] メンバーデータにはポインタとリファレンスのどちらを使うべきですか?