2016-04-02 2 views
0

Angenommen, ichÜberschreiben - wie man es mit weniger Tipparbeit macht?

class A 
{ 
public: 
    virtual void Muhahahaha(int a, float f, Object C, Smth else, Etc etc); 
}; 

und

class B: public A 
{ 
public: 
    virtual void Muhahahaha(int a, float f, Object C, Smth else, Etc etc) override; 
}; 

Jetzt habe, stört mich, was die Tatsache ist, dass ich das ganze Argument Liste ich jedes Mal neu eingeben haben eine Basis-Klasse-Memberfunktion außer Kraft setzen. Warum konnte ich nicht einfach so etwas schreiben:

virtual void Muhahahaha override; 

und der Compiler weiß nur, was ich dort will? Nun, abgesehen von dem Fall, wenn es nur einen Muhahahaha gibt, natürlich ...

Gibt es so einen Weg?

+2

'Gibt es so einen Weg?' Nein, gibt es nicht. –

+1

Verwenden Sie ein Makro (nicht schießen ...); =) –

+0

Der einfachste Weg, weniger Tippen zu tun wäre, "virtuelle" in der abgeleiteten Klasse wegzulassen. – juanchopanza

Antwort

3

Gibt es so einen Weg?

Ja, aber Sie müssen es nie tun.

Ich werde nicht

Schauen Sie, wenn ich Ihnen zeigen diese, und Sie tun es, mein Ruf leiden ...

I Versprechen

Sie werden mich nur abmelden, nur um Ihnen zu zeigen ...

Komm weiter, bitte ...?

ok dann:

#define OBFUSCATE Muhahahaha(int a, float f, double C, char etc) 

class A 
{ 
public: 
    virtual void OBFUSCATE; 
}; 

class B: public A 
{ 
public: 
    virtual void OBFUSCATE override; 
}; 

void A::OBFUSCATE 
{ 
    // try to debug this 
} 

void B::OBFUSCATE 
{ 
    // try to debug this too! 
} 
+0

werde ich nicht, ich verspreche :) – user3496846

1

Das Problem ist, dass Sie zu viele Parameter in einer einzigen Funktion einnehmen. Das ist schlecht für jede Funktion, virtuell oder nicht.

Als Beispiel für eine Lösung, die oft funktioniert, um dieses Problem zu mindern, warum bündeln Sie nicht int a, float f, Object C, Smth else, Etc etc in einer Klasse? Wie folgt aus:

struct Parameters 
{ 
    int a; 
    float f; 
    Object C; 
    Smth Else; 
    Etc etc; 
}; 

Dann haben Sie weniger tippen zu tun:

class A 
{ 
public: 
    virtual void Muhahahaha(Parameters const& arguments); 
}; 

class B : public A 
{ 
public: 
    void Muhahahaha(Parameters const& arguments) override; 
}; 

Die Tatsache, dass Sie „die ganze Argumentliste neu eingeben müssen jedes Mal“ nur ein Symptom ist. Sobald Sie Ihren Code so umgestaltet haben, dass die Argumentliste kurz wird, verschwindet das Problem von selbst.

Verwandte Themen