2012-03-21 23 views
5

Ho riscontrato un problema con la specifica dei valori predefiniti per i membri della classe C++. Il mio codice è:C++: valori predefiniti nel membro della classe

Da Someclass.h:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool); 
} 

... da SomeClass.cpp:

void SomeClass::printOut(bool foobar=true) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

... e, infine, da main.cpp :

int main() 
{ 
    SomeClass s; 
    s.printOut(); 
    return 0; 
} 

Questo dà però messaggio di errore (GCC):

../main.cpp: In function `int main()': 
../main.cpp:8: error: no matching function for call to `SomeClass::printOut()' 
../SomeClass.h:18: note: candidates are: void SomeClass::printOut(bool) 
subdir.mk:21: recipe for target `main.o' failed 
make: *** [main.o] Error 1 

Ho provato a specificare il valore di default direttamente nella dichiarazione della classe nel file di intestazione, ecc ho anche provato a cercare sia Stack Overflow e Google in generale, ma non ci riesce trova qualsiasi soluzione ovunque. Che cosa sto facendo di sbagliato?

risposta

6

Non è stato specificato il valore predefinito per il parametro nell'intestazione in quanto tale, il compilatore sta cercando una funzione della firma void printOut(void) per la tua affermazione s.printOut(); ma non lo trova correttamente. Quello che vi serve è:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut(bool fValue = true); // Note change in param in definition 
} 

E nel tuo cpp:

void SomeClass::printOut(bool foobar /*=true*/) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

Come nota a margine, tenere a mente che non mettere il valore di default commentata per il parametro per l'attuazione file ma è una buona idea per la leggibilità.

+0

Avrei giurato di averlo provato. : -S Comunque - come sicuramente non l'ho fatto - ha funzionato perfettamente e sono molto grato per il tuo aiuto - grazie! – gustafbstrom

+0

Piacere mio, felice di poterti aiutare. – Konrad

1

Il valore predefinito deve essere specificato nella dichiarazione del metodo, non nell'implementazione.

+0

Grazie. Questo ha fatto il trucco! – gustafbstrom

4

È necessario dichiarare il valore predefinito all'interno della definizione della classe, non nell'implementazione.

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar = true); //move default here 
} 

void SomeClass::printOut(bool foobar)  //remove from here 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

Si noti inoltre che:

SomeClass s(); 

non fa quello che ci si aspetta che faccia. Non crea un oggetto s di tipo SomeClass, ma dichiara una funzione s con tipo di ritorno SomeClass. s.printOut(); non dovrebbe essere compilato.

Probabilmente si desidera:

SomeClass s; 
+0

Avrei giurato di averlo provato. : -S Comunque - come sicuramente non l'ho fatto - ha funzionato perfettamente e sono molto grato per il tuo aiuto - grazie! Inoltre, grazie per aver segnalato il problema s(), che in realtà era un errore di battitura in questo caso. Mostra le capacità di lettura del codice vero! – gustafbstrom

1

parametri predefiniti devono essere definiti nell'intestazione come questo:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool value = true); 
} 
1

riscrivere come segue ..nota bool b = false

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool b=false); 
} 
1

tenta di specificare il valore di default nel file di intestazione:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar=true); 
} 
0

valore predefinito deve essere specificato nella dichiarazione e non nella definizione. È possibile specificare il valore predefinito in entrambi i posti, ma non può omettere dalla definizione. spero di non confonderti. Mostrerò l'e \ corretto codice in modo che si possa capire:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar = true); 
} 

... da SomeClass.cpp:

void SomeClass::printOut() //or you can use: void SomeClass::printOut(bool foobar=true) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

... e, infine, da main.cpp:

int main() 
{ 
    SomeClass s(); 
    s.printOut(); 
    return 0; 
} 
+0

Questo non verrà compilato, la firma nella tua implementazione è errata – Konrad

+0

di quale linea di codice stai parlando? –

+0

Grazie, questo ha reso il trucco. La riga 'SomeClass s();' era in realtà un errore di battitura che, ovviamente, dovrebbe essere semplicemente 'SomeClass s;' Grazie per aver segnalato comunque. – gustafbstrom

Problemi correlati