2012-02-13 13 views
1

ヘッダーを変更せずにクラスに機能を追加することは、C++や他のコンパイル言語で可能ですか?ヘッダーを変更せずにC++クラスを拡張する

JavaScriptでは、オブジェクトを作成した後にオブジェクトに関数を追加できます。 C++では何か遠隔操作が可能ですか?私はいくつかのroutine.oファイルをユーザに提供し、彼らはそれを拡張する必要があり、

void routine::NeverBeforeDeclaredFunction() { ... } 

許可されていません。この正確な例のようなものではなく、同様のものがあるためにのために

使用例は、でしょうか?私は、このクラスに関数ポインタの配列を持たせることを考えました。そして、ユーザーがその配列を独自の関数に取り込むようにしました。しかし、プライベート変数へのアクセスやthisへのアクセスなどの利点はありません。

+0

¤はい、継承を使用できます。継承とオープン・クローズの原則についてお読みください。乾杯、 –

+0

あなたのニーズに合わせて継承しませんか?すなわち、あなたのクラスのユーザーはそれを継承し、その上で拡張することができます。 –

+0

継承は別の名前の新しいクラスを作成します。コードの残りの部分がクラス名が 'routine'であると期待していない場合には、これはうまくいくでしょう。 – Mikhail

答えて

3

それはありません、あなたは実行時にもC++でコンパイル時にそれを行うことはできません

C++で、可能です。多くの頭痛のない少なくとも移植可能ではありません。サブクラスを作成できますが、それは「同じクラス」ではありません。クラスがテンプレートクラスの場合は、独自のスペシャライゼーションを提供できます(ただし、別のタイプです)。

C++/CX(C++へのMicrosoft言語拡張)では、partial classesが可能です。あなたが移植性を気にしなければ、これはあなたの問題に対する解決策かもしれません。コンパイル時に行われることに注意してください。

などのコンパイル済み言語を使用して、ヘッダーを変更せずにクラスに機能を追加できますか?

Objective-Cでは、これをカテゴリ(コンパイル時間)とObjective-Cランタイム(ランタイム)で使用できます。

+0

Partial Classesについて聞いたことがありません!ありがとう! – Mikhail

1

コンパイルされた言語Objective Cは非常にダイナミックですが、その機能はプロトタイプベースの継承を持つ言語であるJavascriptとは異なります。

C++で行うことができるのは、std::stringという仮想メソッドを用意し、動的ディスパッチの貧弱な人のバージョンに対して、クラスのインスタンスを最初の引数として取る関数ポインタを返すことです。この場合に共有される必要があるのは、関数ポインタのタイプだけです。

1

答えは、少なくともC++の場合はnoです。ヘッダーのアイデアは、宣言されているオブジェクト/関数のインターフェイス全体を完全にキャプチャすることです。あなたがそうすることができたとしても、おそらく良い習慣ではないでしょう。

メンバー関数(仮想ではない)はすべて、暗黙の「this」パラメータを持ち、親オブジェクトのメンバーにアクセスできます。明示的な「this」パラメータを持つ関数ポインタを使用できます。プライベートメンバーへのアクセスに関しては、友人の機能を宣言することができます(残念なことにヘッダーを変更する必要があります)。

0

「コンパイルされた」と「コンパイルされていない」言語の間ではなく「厳密に型指定された」言語と「弱く型付けされた」言語との間に問題があります。

厳密に型指定されたオブジェクト指向言語の場合、クラスの拡張のみが新しいメソッドをもたらすことができます。それは「オブジェクト」のポイントです。しかし、オブジェクトを拡張するには、オブジェクトの作成を制御する必要があります。

しかし、このような何かの必要性が今や現れ、各言語は "拡大"のように見えるものが出てくる(この文脈では "拡張"を避ける)既存のもの。

これを動作させることができるように、例えばC++は、ストリーム用のオーバーロードメソッドを使用しています。C#ので

cout << var_of_some_non_standard_type; 

をあなたは拡張メソッドを持っている - あなた自身のコードでは、クラスが持っている、ふりをすることができますいくつかの方法。コンパイラはそれらを静的メソッドにマップします。

Javaでは、機能の静的インポートを使用して、コード内で少しでもふりをすることができます。

0

これは機能を拡張することによってどのような意味があるかによって異なります。

通常、機能を拡張すると、クラスが拡張されます。したがって、はいの場合、クラスから派生し、さらに基本クラスの型を保持しながら、さらに機能を追加することができます。継承はis-aの関係です。

既存のクラスに機能を追加したり、ヘッダーを変更したりせずに機能を追加することは、不可能です。あなたが私に尋ねるなら、これは良いことです。

関連する問題