2012-11-11 25 views
8

Ho una classe come ::chiamata di funzione statica non statica in C++

Class Test 
{ 
    public: 
    void Check(){//dosomething}; 
    static void call(){//I want to call check()}; 
}; 

Perché call() è un membro statico, quindi non può richiamare le funzioni non statici, quindi penso di usare Check() in call() sta per creare il puntatore Test e quindi puntare su Check(), ma penso che non sia buono, c'è un modo migliore per farlo? Posso riscrivere tutte le cose nella funzione statica, quindi non ho più bisogno di chiamare Check(), ma quello che voglio è riutilizzare il codice in Check() ed evitare codice ripetuto.

+0

Non è chiaro cosa stai cercando di fare.Puoi inventare milioni di modi per aggirarlo con la lingua, ma alla fine la ragione per cui ti trovi in ​​questa situazione è che il tuo requisito non ha senso. Non esiste un contesto oggetto all'interno di 'call'. Perché pensi di doverlo fare? –

+0

Perché non dichiarare 'Verifica' una funzione statica? –

+1

È necessaria un'istanza di 'class test' per chiamare qualsiasi funzione non statica (ad esempio il puntatore' this'). – mark

risposta

9

Dal momento che avete bisogno di un esempio, hai per creare uno, utilizzare un'istanza statica, o pas a call():

Class Test 
{ 
    private: 
    static Test instance; 

    public: 
    void Check(){//dosomething}; 
    // use one of the following: 
    static void call(Test& t){ t.check(); }; 
    static void call(){ Test t; t.check(); }; 
    static void call(){ instance.check(); }; 
}; 
+1

Come impostare la variabile di istanza? – JavaRunner

3

Sembra che ci sia un cattivo progetto in corso.

In ogni caso, ciò che si può fare è creare un'istanza di Test in chiamata e chiamare Verifica su quell'istanza. L'attuazione di chiamata sarebbe qualcosa come questo allora:

void call(){ 
    Test test; 
    test.Check(); 
} 

Si noti tuttavia che se Controllare fa qualcosa con i membri di prova, sarà naturalmente applicabile solo all'oggetto test creato. Vorrei ripensare se vuoi davvero che la chiamata sia statica o che Check non lo sia.

0

Non esiste una risposta semplice a questa. Ci sono varie cose che potresti fare, ma ciò che è giusto dipende da cosa significa il tuo codice. È una domanda di progettazione , non una domanda di programmazione.

Hai già suggerito vari trucchi di programmazione che è possibile eseguire, ad esempio la creazione di un puntatore Test (in realtà non è necessario un puntatore Test, solo un oggetto Test). Potrei suggerire altri trucchi, ad esempio potresti riscrivere call() in modo che non sia statico, o (quasi la stessa cosa) potresti passare un puntatore Test come parametro di call() e usarlo, oppure potresti creare un oggetto globale Test e usa quello Nessuno di questi arriva al cuore del problema. Per rispondere alla tua domanda devi porsi domande come, perché ho fatto la statica call() in primo luogo, perché una funzione statica deve chiamare una funzione non statica.

Se riesci a spiegarlo, è più facile dare consigli più specifici.

0

La chiave diversa tra una funzione membro non statica e una membro statico è che quest'ultima non ha alcun oggetto. Ha comunque gli stessi privilegi di accesso come tutti gli altri membri.

Quando si desidera chiamare una funzione membro non statico da un membro statico, è comunque necessario trovare un oggetto. Spesso, la funzione dei membri statici veniva passata in qualche contesto per raggiungere un oggetto. Dai suoni della tua domanda sembra che le funzioni statiche e non statiche siano pensate per fare cose simili che non richiedono e non obiettano. In questo caso è probabilmente meglio fattorizzare la parte comune, indipendente da qualsiasi oggetto, in un'altra funzione che viene poi chiamato da entrambi call() e Check():

void Test::call() { 
    common(); 
    // ... other code 
} 
void Test::Check() { 
    common(); 
    // ... other code, possibly depending on "this" 
} 
void Test::common() { 
    // logic shared by both call() and Check() but not depending on "this" 
} 

Se il codice comune ha bisogno di un oggetto, non c'è in altro modo rispetto a un oggetto nella funzione membro statico.

Problemi correlati