2016-12-08 2 views
0

私はthis答えに基づいて、CでOOPを試しています。私はかなり逃げることのできないものに出くわしました。私はCでthisキーワードを使用する方法があった場合、それははるかに簡単かつ明確になると思いますオブジェクト指向のCプログラミング - 'this'キーワードに相当しますか?

struct foo { 
    int val; 
    int (*bar)(struct foo, int); 
} 

int foo_bar(struct foo mod, int val) 
{ 
    mod.val = val; 
} 

int main(void) 
{ 
    struct foo foo; 
    foo.bar = foo_bar; 
    foo.bar(foo, 8); 
} 

:この例を見てみましょう

struct foo { 
    int val; 
    int (*bar)(struct foo, int); 
} 

int foo_bar(int val) 
{ 
    this.val = val; 
} 

int main(void) 
{ 
    struct foo foo; 
    foo.bar = foo_bar; 
    foo.bar(8); 
} 

それは不可能に聞こえるが、いくつかの回避策があるかもしれませんそこに、C自体のOOPのようなビット。オブジェクト指向のCでthisキーワードの機能を実現する方法はありますか?

+3

C++のすべてのオブジェクトは、 "this"ポインタと呼ばれる重要なポインタを介して独自のアドレスにアクセスできます。 'this'ポインタは、すべての非静的メンバー関数呼び出しに隠された引数として渡されます。私は、cの動作を変更する必要がある場合、cの動作を変更する必要はないと思います。 –

+0

これを使用する必要があるのであれば、なぜC++を使用するだけではないのですか? @SumitGeminiは、このポインタを手動で渡すことができると言った。 – brianxautumn

答えて

5

this C++のキーワードは、実際のオブジェクトへの参照であり、実際にはABIレベルのメンバ関数に明示的に渡されます。明示的にこのオブジェクトへのポインタすなわち

struct foo { 
    int value; 
    int (*func)(struct foo *, int); 
}; 

void foo_bar(struct foo *f, int value) 
{ 
    f->value = value; 
} 

ではなく、最初のパラメータとして渡される意味C.注意最高の等価は、関数(第1のパラメータとして)オブジェクトへのポインタを通過さ構造そのもの。これは、オブジェクトが参照渡しされていることを明示し、そのようなコードの理解と維持を容易にします。


2つが何らかの形で関係している場合でも、他のいくつかのプログラミング言語で有効であることが1つのプログラミング言語で見られる機能を期待するのは正気ではありません。

あなたは、各プログラミング言語が独自の問題解決のためのアプローチを持っていることがわかります。paradigm普遍的なベストがないので、問題は、最も適用性の高い/効率的/有用なパラダイムを持つプログラミング言語を使用して最もよく解決されます。パラダイムが可能です。たとえば、一般的なコマンドラインタスクを高速化するためのC++プログラムを作成しないでください。代わりにシェルスクリプトまたは他の簡単なスクリプト言語を使用します。

プログラマとして、あるプログラミング言語のパラダイムから別のプログラミング言語のパラダイムに切り替えることができるということは、異なる視点から問題を見る能力があることを意味します。現在のソフトウェアプロジェクトを見ると、最も堅牢で重要な効率的なプロジェクトは、その能力を持つプログラマーによって書かれています。

これは、上記のように、あるプログラミング言語の機能やパラダイムが他者に移植されることを期待するのは賢明ではないということです。これは、単一のツールを持つことと同等であり、手元にあるツールがそれらを解決する唯一の可能性のあるツールであるかのようにすべての問題を調べることと同等であるため、これを行うべきではありません。 (もしハンマーがあれば、すべての問題は爪のように見えます)。異なるプログラミング言語の異なるパラダイムを習得し、特に受け入れることを学ぶことで、より良いプログラマー、優れた問題解決者ができます。

+0

C + +が本当にABIに 'this 'を渡すのなら、これは正しい答えのようです。 –

+1

@MDXF:あなたを失望させるわけではありませんでした。小さなクラスをアセンブリ( 'g ++ -S')にコンパイルするか、オブジェクトファイルにコンパイルして(例えば' objdump -d'を使って)逆アセンブルするだけで、これを自分で確認することができます。(証明がほしいなら、ちょうどそう言います、私は表示し、再現する方法を教えてください)プログラミング言語が物を得るためのすばらしいツールを提供しても、それの後ろには決して奇妙なことはありません。ちょうどハードワークと良いアルゴリズム。私たちは皆、巨人の肩の上に立っています。プログラミング言語でさえも。 –

+0

私はCの限界に苦しんでいるので、答えにそれほど残念ではありません - 最後に使用された変数や呼び出し構造/関数などを参照するメモリアドレスやグローバルポインタのようなものがあるかもしれないと思ったそれ。しかし明らかにそうではありません。しかたがない; Cがそれをすることができないなら、それについては心配する必要はありません。 'XD' –

関連する問題