Frage

Ich frage mich, ob es möglich ist, Hauptprogramm zu einer vorhandenen Klasse in Header-Datei definiert hinzuzufügen Methoden. Zum Beispiel: Es gibt class CFun in Datei CFun.hpp definiert, aber in unserem party.cpp wollen wir eine Methode void hello() {cout << "hello" << endl;};without Bearbeitung CFun.hpp

hinzufügen

Offensichtlich (leider) Konstruktion:

#include "CFun.hpp"

class CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

funktioniert nicht einen Fehler Multiple declaration for 'CFun' Rückkehr

Ist es möglich, sie ohne Klassenvererbung funktioniert?

War es hilfreich?

Lösung

Nein, aber Sie könnten eine Methode hinzufügen, die einen Verweis / Zeiger auf eine CFUN Klasse nimmt - Sie einfach nicht den Zugang zu privaten Daten haben:

void Hello(CFun &fun)
{
    cout << "hello" << endl;
}

Dies ist wahrscheinlich die besten Sie tun können. Wie durch litb darauf hingewiesen - diese Funktion hat im gleichen Namensraum wie CFUN sein. Glücklicherweise Namensraum, im Gegensatz zu Klassen kann, um an mehreren Stellen hinzugefügt werden.

Andere Tipps

Sie können die Klasse wie folgt neu zu definieren:

#define CFun CLessFun
#include "CFun.hpp"
#undef CFun

class CFun : CLessFun
{
   public:
    void hello() {cout << "hello" << endl;};
};

Setzen Sie diese in einer neuen Header-Datei CMoreFun.hpp und beinhaltet, dass anstelle von CFun.hpp

Nein, das ist nicht möglich. Es kann nur eine Definition einer bestimmten Klasse sein, und es hat eine vollständige Definition sein, was bedeutet, dass Sie nicht Teil-Definitionen in verschiedenen Orten haben, die Mitglieder der Klasse hinzuzufügen.

Wenn Sie eine Elementfunktion einer Klasse hinzuzufügen, dann entweder Sie die Klassendefinition zu ändern (bearbeiten CFun.hpp) oder eine neue Klasse von CFun ableiten und setzen hello() es.

Die nächste Analog zu dieser Art von Konstrukt (Hinzufügen von Funktionalität zu vordefinierten Klassen) in C ++ ist der Dekorierermuster. Es ist nicht genau das, was Sie wollen, aber es kann Ihnen erlauben, zu tun, was Sie benötigen.

Dies scheint wie ein offensichtlicher Anwendungsfall für die Vererbung. Definieren Sie eine neue Klasse:

#include "CFun.hpp"

class CFun2 : public CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

Dann CFun2 anstelle von CFun im Quellcode.

Nach über sie denken, sie könnte etwas tun schrecklich: eine Funktion in CFUN finden, die einen Rückgabetyp hat, die Sie wollen, und nur erwähnen einmal im gesamten Header. Lassen Sie uns sagen void GoodBye().

Jetzt eine Datei CFunWrapper.hpp mit diesem Inhalt erstellen:

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye()
#include "CFun.hpp"
#undef GoodBye

Dann ist immer nur CFunWrapper.hpp statt CFun.hpp.

Aber dies nicht tun, es sei denn, es einige wirklich guten Grund, dies zu tun. Es ist extrem anfällig für brechen, und nicht einmal möglich sein kann, abhängig von den Inhalten der CFun.hpp.

Mein Wissen nicht. Obwohl, könnte man eine Art von Manipulation der Geschworene tun und eine Namespace-y-Lösung machen.

class Party : class CFun

(Ihr party.cpp)

erbt CFUN Sachen, einschließlich hallo () Funktion.

So ...

Party p;
p.hello();

Nein?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top