2009-04-22 12 views
1

同じクラスのインスタンスが2つあるとします。クラスはいくつかのデータへのポインタを持っていますが、私は、インスタンスがいくつかのプライベート関数のアルゴリズムの一部としてポインタを交換することを望みますが、パブリック関数を介して直接アクセスすることによって他の人にデータを妥協することはありません。異なるインスタンスを通信させる

私の最初のアイデアは、Exchangeという名前のbool型の静的変数と、プライベートなもの:void requestExchange()とpublic **:** ** respond()の2つのメソッドを追加することでした。

if(exchange==true){ 
    exchange=false; 
    return data; 
} 
else{return...?! 

私はNO」をシミュレートする方法がないことに気づいたときにこれがあった。 requestExchangeは、次の操作を行いますされ、真の交換を設定します、とすぐに、選択したインスタンスから応答()と続きますOP "はデータが実際にはNULLになる可能性があるため、すべてが応答となります。何ができるかについての任意のアイデア?

UPDATE:私はちょっと考えました。リクエストとレスポンスのコンボは、結果としてNULLが意味を持つ(交換が最も確かに正しい)コンテキストでのみ呼び出されるため、NULLを返すだけですこのようにNO OPをシミュレートします。結果として外部者のNULLには役に立たない...しかし、私はまだ提案に興味がある。これを行うためのより構造化された方法が必要です。

+0

は、あなたが求めているものを示し、より多くのコードを投稿について –

答えて

3

同じクラスのオブジェクトは、お互いのプライベートデータに直接アクセスできます。たとえば、コピーコンストラクタではこれをよく見ています。

+0

*顔ヤシ* OKおかげで...私はC++の記憶が思ったより悪いと思っています。 –

0

問題の説明はあまり明確ではありません。 respond()をprivate関数にするだけではどうですか?

静的なクラスメンバを持つアイデアは危険に満ちています。そのようなインスタンスの2つのペアが同時に通信したい場合はどうなりますか? respond()を呼び出す前に交換フラグをセットしてから終了するとどうなりますか?スレッドの安全性はどうですか?

NO-OPまたはエラーインジケータを返す場合、例外を使用することができます(それはそのためのものですが、プロジェクトで例外を使用しない場合は突然導入することは好ましくありません) boost ::のオプションです。

0

データを返却して交換することについて懸念を分けるのが最善の場合があります。

class Foo 
{ 
public: 
    Bar* data() 
    { 
     return pData; 
    } 
private: 
    void exchangeData(Foo& Rhs) 
    { 
     if (this != &Rhs) 
     { 
     Bar* pTmp = pData; 
     pData = Rhs.pData; 
     Rhs.pData = pTmp; 
     } 
    } 
    Bar* pData; 
} 

願わくはそれはあなたが望む線に沿っていますか?質問は非常に明確ではありません....

+0

exchangeData()関数はpublicにできます。 – TonJ

+0

私は彼の主な懸念は、あなたが私的な文脈からのみ交換を行うことができるということです。 – Snazzer

0

私はおそらくあなたの質問のポイントを逃した。なぜこれはあなたが望むことをしないのですか?

class CMyClass 
{ 
public: 
    void ExchangePointerWith(CMyClass& rhs); 

private: 
    void* m_MyPtr; 
}; 

と:

void CMyClass::ExchangePointerWith(CMyClass &rhs) 
{ 
    void* tmp= m_MyPtr; 
    m_MyPtr= rhs.m_MyPtr; 
    rhs.m_MyPtr= tmp; 
} 
0

使用のstd ::スワップ()、あなたはそれが例外安全でなければなりません知っている、あなたのクラスの独自のスワップ方法を構築します。 swap()は、STLの効率を高めるために、ほとんどのクラスが実装すべき標準のルーティングです。

クラスは自動的に自分自身の友人であることに注意してください。したがって、同じクラスの別のインスタンスのプライベートメンバー変数にアクセスできます。見る(Friend scope in C++

#include <algorithm> 

class myX 
{ 
    public: 
     void swap(myX& rhs) throw() 
     { 
      std::swap(data,rhs.data); 
     } 
    private: 
     void* data; 
};