2013-06-05 5 views
12

Non so cosa cercare per trovare una spiegazione per questo, quindi sto chiedendo.
Ho questo codice che segnala l'errore:Errore `` non nome di tipo` in C++

struct Settings{ 
    int width; 
    int height; 
} settings; 

settings.width = 800; // 'settings' does not name a type error 
settings.height = 600; // 'settings' does not name a type error 

int main(){ 
    cout << settings.width << " " << settings.height << endl; 

ma se ho messo l'assegnazione valore principale, funziona:

struct Settings{ 
    int width; 
    int height; 
} settings; 

main() { 
    settings.width = 800; // no error 
    settings.height = 600; // no error 

si può spiegare a me perché?

EDIT:
Riguardo alla risposta di Ralph Tandetzky, ecco il mio codice completo struct. Potresti mostrarmi come assegnare i valori come hai fatto con la mia struct snippet?

struct Settings{ 
    struct Dimensions{ 
     int width; 
     int height; 
    } screen; 

    struct Build_menu:Dimensions{ 
     int border_width; 
    } build_menu; 
} settings; 

risposta

24

Non è possibile inserire compiti al di fuori del contesto di una funzione in C++. Se stai perplesso per il fatto che a volte visto il simbolo = essere utilizzato al di fuori del contesto di una funzione, come ad esempio:

int x = 42; // <== THIS IS NOT AN ASSIGNMENT! 

int main() 
{ 
    // ... 
} 

Questo perché il simbolo = può essere utilizzato per l'inizializzazione pure. Nel tuo esempio, non stai inizializzando i membri dei dati width e height, stai assegnando loro un valore.

+0

wow un problema così sottile. non l'avevo mai notato. + 1. l'unica cosa che manca qui è il solito riferimento std. siete andy o qualche altro ragazzo che ha violato l'account di andy? :-) –

+1

Oh dannazione, fantastico. Sto anche usando l'inizializzazione, quindi non stavo capendo perché questo non ha funzionato dato che avevo molte più variabili prima di questa struttura. Quindi per essere chiari. 'int i = 5;' funzionerebbe, ma 'int i;' seguito da 'i = 5;' non funzionerebbe? – Qwerty

+1

@Qwerty: esattamente –

8

in C++ 11 è possibile scrivere

struct Settings { 
    int width; 
    int height; 
} settings = { 800, 600 }; 

al fine di correggere il bug. L'errore appare perché stai cercando di assegnare un valore al di fuori del corpo di una funzione. È possibile inizializzare ma non assegnare dati globali al di fuori di una funzione.

EDIT:

Per quanto riguarda la tua modifica, basta scrivere

Settings settings = {{800, 600}, {10, 20, 3}}; 

non sono sicuro al 100%, se questo funziona, però, a causa della eredità. Raccomanderei di evitare l'ereditarietà in questo caso e scrivere lo Dimensions come dati membro nella struttura Build_menu. L'ereditarietà prima o poi ti darà ogni tipo di problema, se usato in questo modo. Prefer composition to inheritance. Quando lo fai, assomiglierà a

Settings settings = {{800, 600}, {{10, 20}, 3}}; 
+0

puoi scrivere anche questo 'struct Settings { int width = 10; altezza int = 20; } impostazioni; ' –

+0

Oh grazie, per quanto mi riguarda, avrei un'altra domanda. La struttura che ho postato era solo un frammento della mia vera struttura. Aggiornerò la mia domanda, saresti così gentile e vedrò come potrei farlo funzionare usando questo assignmenet? Sto definendo la mia struttura all'inizio del mio main.cpp (dopo include ovviamente) quindi è la prima cosa da vedere nel mio codice. Questo è il motivo per cui preferirei assegnare tale valore al parametro assign, invece che a main() che si trova sulla trentesima linea. – Qwerty

+0

@Qwerty questa è solo l'inizializzazione. per impostare la tua struttura su un valore iniziale in modo da conoscere lo stato di questi membri. in seguito è possibile modificarlo in modo accidentale nel programma. \ –