2009-08-05 6 views
1

申し訳ありませんが、何らかの理由で私は以前の 投稿にコメントを追加できません。いくつかの人々は、私が受け取った正確なエラーメッセージを知りたがっています。オブジェクト指向プログラミングの質問:グローバルオブジェクトパートII

私はおそらくかなり単純な問題を抱えていますが、まだ適切な デザインの決定が見つかりませんでした。基本的に、私は4つの異なる継承クラスを持ち、 これらの各クラスには10以上のメソッドがあります。

それぞれのクラスは同じTCPソケットを使用する必要があります。この オブジェクトは、プログラムの実行中にソケットをサーバーに対して開いたままにします。 私の考えはすべて 他のクラスがそれを使用できるように、「グローバル」として宣言obejct TCP持っていることだった。それを宣言するときに、...クラスCおよびclassDため

classTCP TCPSocket; 

class classA 
{ 
private: 
public: 
classA(); 
virtual void method1(); 
... 

}; 

class classB 
{ 
private: 
public: 
classB(); 
virtual void method1(); 
    ... 

}; 

などを不幸に

私のSymbian GCC-Eコンパイラのようにエラーメッセージ

elf2e32の後に が表示されます。エラー:E1027:ELFファイルに初期化された書き込み可能なデータが含まれています。

私はこの TCPオブジェクトを他のすべてのクラスとその メソッドで使用できるように宣言できる他の方法があるかどうか疑問に思っていますか? classA()は、 がこのサブシステムを初期化するときに呼び出される最初のメソッドです。

多くの感謝!

+0

あなたはコメントするのに十分な担当者を持っていませんが、あなたは常に質問を編集することができ、そしてそれはあなたがこのケースで行っているべきです。 –

+0

残念ながら私は最初にアカウントを取得する必要があります。私がゲストとして投稿すると、別のマシンから編集することはできません。 –

答えて

-1
+0

デフォルトではスレッドセーフではありません。 – nagul

+0

これは、彼が関心を持っているとは思えない複数のソケットを作成することを防ぐという面白い副作用を持っていると私は思っています。「シングルトンはグローバルのドロップイン置換ではありません。 – jalf

+0

@ jalf:私はあなたの意見を理解しているかどうかはわかりません。シングルトンは、複数のオブジェクトを持つことを妨げません。たとえば、SocketManager.createNewSocket()... –

1

要求に応じて静的インスタンスを取得するための非常にエレガントな方法があります。

classTCP& SingletonInstance() 
{ 
    static classTCP instance; 
    return instance; 
} 

Ideaは、必要に応じてローカル静的変数を初期化するために、C++機能を使用しています。

+0

これは、関数が最初に呼び出されるときの潜在的な競合条件であり、2つのスレッドがclassTCPを同時に初期化しようとする唯一の問題です。 – jalf

+0

volatileキーワードを使用しても問題はありません。 – Dewfy

0

classAとclassBの両方が同じ親から継承できるようにすることで、クラス全体の静的メンバーをサポートできます。

class BaseTCP { 
    static classTCP tcp; 
    // ... 
}; 

class classA : BaseTCP { 
    // ... 
}; 

class classB : BaseTCP { 
    // ... 
}; 

ここで、classAとClassBは同じ静的メンバーを共有します。規定は、あなたが今BaseTCPクラスのどこかの外で静的メンバを宣言しなければならないことに似ています...あなたの状況に応じて、これはやり過ぎかもしれ

classTCP BaseTCP::tcp; 

代わりにシングルトンを使用しての
0

、 classTCPインスタンスを作成し、他のオブジェクトへの参照を渡すだけで、それぞれがclassTCPの単一インスタンスへの参照(またはポインタ)を所有するのはなぜですか?

これははるかに柔軟な設計を提供します - シングルトンは一般的には吸い込み、一般に信じられているよりはるかに限られた使用しかないと思います。シングルトンを使用する場合、classA、classBなどのクラスにはオプションがありませんが、シングルトンインスタンスを使用します。より標準的なオブジェクトコンポジションデザインを使用すると、全体を自由にすることができます。

自分の質問に答えてください。アプリケーションを1台以上のサーバーに接続したいのですが?クラスAの単体テストコードを記述したいのですが?実際のソケットを使用する必要はないが、ラム内のデータのチャンクを保持するダミーのものを使うことができる場合、ネットワーキングアプリケーション用のユニットテストコードを書くことはずっと簡単です。あなたが例をしたい場合、私は今、ランチ:)

それを私は全体的な設計に重大な複雑さを追加しない提案の方法を行うためのオフだから、コメントを追加しますが、それははるかにオープンになります。

関連する問題