2011-04-01 5 views
3

メソッドのシグネチャをオブジェクト所有者船が変更されたかどうかにコードする方法はありますか?ポインタを受け取ったり返すGetter()とSetter()では、オブジェクトの所有権が変更されるかどうかは決して分かりません。メソッドのオブジェクト所有権の命名規則

について、あなたはどう思いますか:(PUT対

// Uses pConfiguration or creates its own copy - the ownership is un-touched 
void ContainerClass:SetConfiguration(const Configuration* pConfiguration) {} 
// Takes the ownership of pConfiguration (and deletes it in the destructor) 
void ContainerClass:PutConfiguration(Configuration* pConfiguration) {} 
// Returns a 'reference' and keeps the ownership (you must not delete it) 
const Configuration* ContainerClass::GetConfiguration() {} 
// Returns a _new_ object and transfers the ownership to you 
Configuration* ContainerClass::TakeConfiguration() {} 

Soは(設定されている)、()と(取得)対()はそれをコーディングするための方法を取るか、タイプを使用するのconst対非const) - またはそれを文脈から知っていますか?

よろしく、

チャーリー

+0

スマートポインタについて調べましたか?この種の問題を避けることができます。 – Naveen

+0

えええええええええええええええええええええええええええええええええええええええええええええもう...私は考えなければならない - すべての私の問題を解決する場合:) – Charly

答えて

5

インターフェイスでオーナーシップが変更されていないことを確認する最も良い方法は、ポインタを使用しないことです。ポインターへの参照を好む:

// Does not take ownership 
void ContainerClass::SetConfiguration(const Configuration& config) {} 

// Does not release ownership 
const Configuration& ContainerClass::getConfiguration() const {} 

実際にメモリの所有権を移転する必要がある場合は、名前で文書化する方がよいでしょう。あなたが本当に署名にそれを明示的にするクレイブを感じた場合は、std::auto_ptr良い古いを使用します。

void ContainerClass::SetConfiguration(std::auto_ptr<Configuration> cfg); 
std::auto_ptr<Configuration> ContainerClass::CopyConfiguration() const; 

std::auto_ptrコピーが実際に所有権移転を意味することに奇妙な性質を持っています。

2
  1. 関数は、多くの場合、常に例itemAttakeAtを呼びかけ所有権法で遊ぶとaddXXXのQtで
  2. (あなたがdoxygenのを使用することができます)良いドキュメントとコメントを書きますドキュメントに反映されている所有権を譲渡する。したがって、get()/take()set()/put()を使用することができます。とにかく、良いドキュメントは常に役に立ちます。あなたの関数名も自己説明されています。
+0

はい、良いドキュメントについては何も議論することです。しかし、署名に命名規則があると、コード内にこの情報があり、別のヘッダーには含まれません。 – Charly

+0

同じ文章で* Qt *と*良い文書*を言うことはできません。 Qtのドキュメンテーションはかなり欠けており、関数シグネチャについても(文書化された)規約はありません。 [QBoxLayout :: addWidget](http://doc.qt.io/qt-5/qboxlayout.html#addWidget)は引数の所有権を譲りますか?当ててみて。ドキュメントをお読みください。ソースコードを読んでください。あなたが "wtf!" *をどの点でぶつけたのかを記録しておいてください。また、良い文書の例としてQtの使用をやめてください。ドキュメンテーションがあなたにソースコードを読ませるなら、何かが間違っています。 – IInspectable

0

ほとんどの場合、ポインタを使用すると、 と始まる「所有権」がないので、変更することは問題ありません。しかし、デザインが鍵です。クラスの ロールは、オブジェクトとの関係を明確にする必要があります を指しています。所有権以上のレベル。また、 という関係は、オブジェクトとの関係を決定します。

オーナーシップが関連する例外的なケースについては、std::auto_ptr が転送を表現する標準的な方法です。それは絶対的な転送、 しかし、パラメータのタイプがstd::auto_ptrの場合、呼び出し元の は関数を呼び出した後でもオブジェクトにアクセスできません。 ( は、スレッド・シナリオで非常に有効であることがわかりました。特定のスレッドがいつでもオブジェクトを所有できるように、 を意味します。 他のスレッドはアクセスできません。std::auto_ptrはこれを と表現しています。明確かつ効果的です)