2017-09-22 2 views
0

überladen Ich möchte eine Klasse erstellen, in der es eine Funktion gibt, die automatisch aufgerufen wird, um Informationen zu verarbeiten, die in dieser Klasseninstanz gespeichert sind.Wie kann ich eine Memberfunktion von einer Instanz einer Klasse

Jede Instanz hat jedoch unterschiedliche Werte und möglicherweise eine andere Möglichkeit, diesen Inhalt zu verarbeiten.

Daher brauche ich etwas ähnlich wie Überladen Konstruktor aber in einer Member-Funktion. Dabei kann jede Instanz die Standardfunktion überlasten oder die Standardeinstellung für die Eingabe beibehalten.

Wie kann das erreicht werden?

+2

Können Sie diese Funktion nicht als Parameter in den Konstruktor übergeben? std :: Funktion zur Rettung! – Bathsheba

+0

@Bathsheba Ich muss es nicht als Parameter übergeben – MoustacheSpy

+1

Ich weiß, dass Sie nicht. Aber vielleicht willst du es *. – Bathsheba

Antwort

0

Durch das Erstellen einer separaten Klasse für das Variablenverhalten Callable können die lokalen Daten, die sich auf die Funktion beziehen und als Klasse sein können, abgeleitet werden.

class Callable { 
public: 
    int m_Value; 
    Callable(int value) : m_Value(value) 
    { 

    } 
    void operator()(int val1, double val2 /* whatever makes sense */) { 

    } 
}; 

Mit der Funktion Operator void operator()(......) wir schaffen eine Art und Weise Variablen vom Typ machen aufrufbare wie eine Funktion zu suchen.

class Variable { 
public: 
    Callable myFunction; 
    Variable(const Callable & howToCall, /* some more stuff */) : 
     myFunction(howToCall) 
    { /* stuff */ 
    } 
    void aFunction(int data, double value) { 
     myFunction(data, value); 
    } 
}; 

Wenn aFunction der aktuelle Wert von myFunction ruft genannt.

Schließlich Variable kann sich ändern, welche Funktion es nennt, indem er den Wert von myFunction Modifizieren ....

myFunction = Callable(/* new parameters */); 
0

Try Funktionen in Constructor Call mit, wenn sonst Bedingung wie:

class abc{ 
abc(){ 
     if username == "member 1" 
      functioncall(); 
     else 
      functioncall(); 
} 

}

0

Soweit ich sehe, benötigen Sie einige virtuelle Konstruktion Emulation. Es gibt einen einfachen C/C++ Weg, dies zu tun.

// Example program 
#include <iostream> 
#include <string> 

struct A; 
typedef void (*cb)(A*); 


struct A 
{ 
    int m_a; 

    static void foo(A* aref) 
    { 
     std::cout << "Print a: " << aref->m_a << "\n"; 
    } 


    A(cb b=foo) 
    { 
     m_a = 100; 
     b(this); 
    } 
}; 

int main() 
{ 
    A a; 

} 

Es ist nicht sehr klar, aber immer noch den Trick.

Verwandte Themen