2012-03-15 8 views
8

C'è un modo per chiamare un metodo membro della classe non statico da un altro metodo contenuto nella classe principale in C++? Se sì, come sarebbe il codice?Chiama un metodo membro non statico da un altro metodo

Il problema è che non posso dichiarare questo metodo specfico come statico, perché utilizza altri metodi all'interno della stessa classe che quindi non funzionano se faccio l'uno statico.

che sto cercando di utilizzare:

MyClass::myClassMethod(); 

da un metodo all'interno della classe principale, ma mi dà l'errore: un punto di riferimento non membro statico deve essere relativo ad un oggetto specifico.

Per chiarire, myClassMethod() utilizza altri metodi all'interno MyClass come:

void myClassMethod() { 
    ... 
    anotherClassMethod(); 
} 

quindi se dovessi fare myClassMethod statica sarebbe interferire con chiamando anotherClassMethod().

+0

Dopo aver letto la domanda e i commenti nelle risposte già pubblicate, sarebbe comunque utile avere ulteriori informazioni su ciò che si sta tentando di fare. 'MyClassMethod' è statico? Da dove viene chiamato? Puoi cambiare gli argomenti per il metodo? Qual è l'obiettivo del problema che ti è stato assegnato? – tmpearce

+0

Sembra che tu abbia davvero bisogno di pensare a quale comportamento potresti desiderare qui. La differenza principale con i metodi statici e non statici è che quest'ultimo deve accedere a entrambi i dati di classe, o forse effettuare chiamate virtuali che internamente fanno più o meno lo stesso. Se 'myClassMethod' chiama' anotherClassMethod' che non è statico, è necessario farlo? In caso contrario, renderli statici. Se sì, allora cosa ti aspetti che accada quando il metodo tenta di accedere ai dati? – Keith

risposta

3

Qual è l'accordo con la chiamata della funzione membro non statico da una funzione membro static?

Ogni funzione membro non statica viene passato un puntatore this implicitamente in aggiunta ai parametri passati, il puntatore passato viene quindi dereferenziato riferirsi membri di oggetto classe Tuttavia static funzioni non sono passati con il puntatore implicito this e quindi non si può chiamare qualsiasi funzione membro non statico all'interno di una funzione membro statico perché non è disponibile lo this.

Qual è la soluzione, se vuoi farlo comunque?

Avrete bisogno di qualche meccanismo per ottenere il puntatore all'oggetto all'interno del metodo statico e quindi potete chiamare la funzione membro usando quel puntatore.
Come fare?
È necessario memorizzare il puntatore sull'oggetto classe globalmente oppure passarlo come un'istanza in uno degli argomenti della funzione al metodo statico.

Tuttavia, entrambi i metodi sopra elencati sono importanti, la cosa importante da notare qui è Se si sente il bisogno di chiamare una funzione membro non statico attraverso una funzione membro statico, allora c'è qualcosa di sbagliato nella progettazione.


Ripensandoci forse ho mis-letto la tua domanda prima, probabilmente, la tua domanda è:

Come chiamare una funzione membro non statica di una classe da main?

È necessaria un'istanza della classe per chiamare funzioni membro non statiche.
Così semplicemente,

MyClass obj; 
obj.myClassMethod(); 

E chiamare qualsiasi altra funzione membro all'interno myClassMethod() sarebbe semplicemente:

void myClassMethod() 
{ 
    //... 
    anyOtherMyClassNonStaticMemberFunction(); 
    //... 
} 
+0

Scusa, sono un principiante. Come lo farei? – aclark

+0

@aclark: Si prega di controllare la risposta aggiornata, ho aggiunto qualche dettaglio in più. Ha senso ha senso? –

+0

Grazie per la spiegazione. Il problema è che il design è dato dall'istruttore, quindi devo lavorarci sopra. Sembra abbastanza complicato anche per me: -/ – aclark

3

L'unico modo per chiamare un metodo non statico di una classe è attraverso un'istanza di quel classe. Così si avrebbe bisogno di qualcosa di simile ...

MyClass myClass; 
myClass.myClassMethod(); 
+0

Questo è fantastico. Grazie. – aclark

4

un metodo statico è uno che non viene eseguito su qualsiasi particolare oggetto. È molto simile a una funzione autonoma al di fuori di una classe, tranne per il fatto che è consentito accedere ai membri privati ​​nella sua classe.

Se si anotherClassMethod() non è statico, significa che deve essere chiamato su un oggetto specifico, un'istanza della classe. Poiché viene richiamato su un oggetto, può accedere ai dati memorizzati in quell'oggetto (variabili membro non statiche). Se myClassMethod() è statico e implementarlo come

void MyClass::myClassMethod() { 
    anotherClassMethod(); 
} 

Questo non funzionerà perché anotherClassMethod() si aspetta di essere chiamato su un oggetto specifico, ma myClassMethod() non ne ha uno. Ma se si sa cosa oggetto che si voglia chiamare, è possibile farlo come chiamata di metodo ordinario su un oggetto:

void MyClass::myClassMethod(MyClass &object) { 
    object.anotherClassMethod(); 
} 

Il object non deve essere passato come argomento; potrebbe essere una variabile membro static nella classe, per esempio:

class MyClass { 
private: 
    static MyClass theInstance; 

    // ... 
}; 

void MyClass::myClassMethod() { 
    theInstance.anotherClassMethod(); 
} 

In definitiva, la domanda è necessario porsi è: perché è myClassMethod() statica, e perché è anotherClassMethod() non statico? Fai un passo indietro, pensa a cosa dovrebbe fare myClassMethod(). Ha senso chiamarlo quando non hai un'istanza con cui lavorare? In tal caso, perché è necessario chiamare un metodo che si aspetta di lavorare con un'istanza?

0

Penso che forse potresti usare il modello singleton, mantenere un'istanza della classe nel globale. come una classe di utilità.