2016-12-08 1 views
0

Ich experimentiere mit OOP in C, basierend auf this Antwort. Ich bin auf etwas gestoßen, bei dem ich nicht ganz zurecht komme. Nehmen Sie dieses Beispiel:Objektorientierte C-Programmierung - äquivalent zu 'diesem' Schlüsselwort?

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); 
} 

ich denke, es wäre viel einfacher und klarer, wenn es eine Möglichkeit gäbe, das this Schlüsselwort in C zu verwenden:

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); 
} 

Es klingt unmöglich, aber es kann etwas Abhilfe sein da draußen, ein bisschen wie OOP in C selbst. Gibt es eine Möglichkeit, die Funktionalität des this-Schlüsselworts in Object-Oriented C zu erreichen?

+3

Jedes Objekt in C++ hat Zugriff auf seine eigene Adresse über einen wichtigen Zeiger namens "dieser" Zeiger. Der "This" -Zeiger wird als verstecktes Argument an alle nicht statischen Mitgliedsfunktionsaufrufe übergeben. Ich denke, es gibt keine Notwendigkeit, das Verhalten von c zu ändern, denn c ist eine Grundlage von C++, wenn Sie das Verhalten von c ändern, wie können Sie dann in beiden Sprachen einen Unterschied machen. –

+0

Wenn Sie dies verwenden müssen, warum nicht nur C++ verwenden? @ SumitGemini sagte, Sie können einen dieser Zeiger manuell übergeben. – brianxautumn

Antwort

5

Nr. this Schlüsselwort in C++ ist eine Referenz auf das vorliegende Objekt und wird tatsächlich explizit an die Mitgliedsfunktionen auf ABI-Ebene übergeben. Explizit Passieren der beste Entsprechung in C. Note einen Zeiger auf das Objekt (als ersten Parameter) in Funktion ist, dass dies bedeutet

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

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

dh die Zeiger auf das Objekt als ersten Parameter übergeben wird, anstatt die Struktur selbst. Dies macht es explizit, dass das Objekt als Referenz übergeben wird, und erleichtert das Verständnis und die Pflege dieses Codes.


Es ist nicht vernünftig Funktionen in einer Programmiersprache gültig zu sein in einer anderen Programmiersprache zu sehen erwarten, auch wenn die beiden irgendwie verwandt sind.

Sie sehen, jede Programmiersprache hat ihren eigenen Ansatz zur Problemlösung, ihre eigenen paradigm. Da es keine universellen besten Paradigma möglich ist, werden Probleme am besten mit einer Programmiersprache gelöst, die das am besten anwendbare/effiziente/nützliche Paradigma hat. Beispielsweise schreiben Sie kein C++ - Programm, um allgemeine Befehlszeilenaufgaben zu beschleunigen. Sie verwenden stattdessen ein Shell-Skript oder eine andere einfache Skriptsprache.

Wenn Sie als Programmierer von einem Programmiersprachenparadigma zu einem anderen wechseln können, haben Sie die Möglichkeit, ein Problem aus verschiedenen Blickwinkeln zu betrachten. Betrachtet man aktuelle Software-Projekte, werden die robustesten, vitalsten und effizientesten von Programmierern geschrieben, die diese Fähigkeit besitzen.

Deshalb habe ich oben gesagt, dass es nicht vernünftig ist zu erwarten, dass die Eigenschaften oder das Paradigma einer Programmiersprache für andere portierbar sind. Das sollten Sie nicht tun, denn es ist gleichbedeutend mit einem einzigen Werkzeug und allen Problemen, als wäre Ihr Werkzeug das einzig mögliche Werkzeug, um sie zu lösen. (Wenn alles, was Sie haben, ein Hammer ist, sehen alle Probleme wie Nägel aus.) Das Lernen und insbesondere das Lernen, die verschiedenen Paradigmen in verschiedenen Programmiersprachen zu akzeptieren, macht einen besseren Programmierer, einen besseren Problemlöser.

+0

So enttäuschend es auch ist ... das scheint die richtige Antwort zu sein, wenn C++ tatsächlich "das" an die ABI weitergibt. –

+1

10 @MDXF: Nun, ich wollte dich nicht enttäuschen. Sie können dies selbst überprüfen, indem Sie einfach eine kleine Klasse zu Assembly ('g ++ -S') oder zu einer Objektdatei kompilieren und sie zerlegen (zum Beispiel mit' objdump -d').(Wenn Sie Beweise wollen, sagen Sie es einfach, und ich werde zeigen und reproduzieren.) Selbst wenn eine Programmiersprache fantastische Werkzeuge zur Verfügung stellt, um etwas zu erreichen, gibt es nie etwas Seltsames dahinter; nur harte Arbeit und gute Algorithmen. Wir stehen alle auf den Schultern von Riesen und so weiter; sogar Programmiersprachen. –

+0

Ich bin nicht so sehr enttäuscht in der Antwort, da ich in den Beschränkungen von C bin - ich dachte, es könnte etwas wie eine Speicheradresse oder ein globaler Zeiger auf die zuletzt verwendete Variable oder auf die aufrufende Struktur/Funktion, etwas wie Das. Aber anscheinend nicht. Naja; Wenn C das nicht kann, dann macht es keinen Sinn, mürrisch zu sein. 'XD' –

Verwandte Themen