2013-03-03 28 views
21

Ho difficoltà a capire come passare in una struct (in base a un riferimento) a una funzione in modo che le funzioni membro della struct possano essere popolate. Finora ho scritto:Passaggio delle strutture alle funzioni

bool data(struct *sampleData) 
{ 

} 

int main(int argc, char *argv[]) { 

     struct sampleData { 

     int N; 
     int M; 
     string sample_name; 
     string speaker; 
    }; 
     data(sampleData); 

} 

L'errore che ottengo è:

C++ richiede un indicatore di tipo per tutte le dichiarazioni dati bool (const & testStruct)

ho provato alcuni esempi spiegati qui: Simple way to pass temporary struct by value in C++?

Spero che qualcuno possa aiutarmi.

+0

stai passando un nome di tipo a una funzione non una variabile? – billz

+0

Questo non è per riferimento, cioè per puntatore. Non hai creato un'istanza di 'sampleData' quindi non ha nome. Inoltre, come è possibile che la funzione dati bool sia in grado di sapere che 'sampleData' esiste? – Rapptz

+0

@billz 'sampleData' è il nome della mia struct. Voglio essere in grado di passare questa struttura alla funzione – Phorce

risposta

67

In primo luogo, la firma dei dati() funzione:

bool data(struct *sampleData) 

non può assolutamente funzionare, perché l'argomento non ha un nome. Quando dichiari un argomento di funzione a cui intendi effettivamente accedere, ha bisogno di un nome. Quindi cambiare a qualcosa come:

bool data(struct sampleData *samples) 

Ma in C++, non c'è bisogno di utilizzare struct a tutti in realtà. Quindi questo può diventare semplicemente:

bool data(sampleData *samples) 

In secondo luogo, il sampleData struct non è noto per i dati() in quel punto. Così si dovrebbe dichiararlo prima:

struct sampleData { 
    int N; 
    int M; 
    string sample_name; 
    string speaker; 
}; 

bool data(sampleData *samples) 
{ 
    samples->N = 10; 
    samples->M = 20; 
    // etc. 
} 

E, infine, è necessario creare una variabile di tipo sampleData. Ad esempio, nella funzione main():

int main(int argc, char *argv[]) { 
    sampleData samples; 
    data(&samples); 
} 

Si noti che è necessario passare l'indirizzo della variabile ai dati di funzione(), dal momento che accetta un puntatore.

Tuttavia, si noti che in C++ è possibile passare direttamente gli argomenti per riferimento e non è necessario "emularlo" con i puntatori. Puoi farlo invece:

// Note that the argument is taken by reference (the "&" in front 
// of the argument name.) 
bool data(sampleData &samples) 
{ 
    samples.N = 10; 
    samples.M = 20; 
    // etc. 
} 

int main(int argc, char *argv[]) { 
    sampleData samples; 

    // No need to pass a pointer here, since data() takes the 
    // passed argument by reference. 
    data(samples); 
} 
1
bool data(sampleData *data) 
{ 
} 

È necessario indicare al metodo quale tipo di struttura si sta utilizzando. In questo caso, sampleData.

Nota: in questo caso, è necessario definire la struttura prima del metodo per il riconoscimento.

Esempio:

struct sampleData 
{ 
    int N; 
    int M; 
    // ... 
}; 

bool data(struct *sampleData) 
{ 

} 

int main(int argc, char *argv[]) { 

     sampleData sd; 
     data(&sd); 

} 

Nota 2: Sono un ragazzo C. Potrebbe esserci un modo più C++ ish per farlo.

+0

Capisco ora. La struct "sample_data" dovrebbe essere prima della funzione stessa? – Phorce

+1

Ancora una volta, questo non è per riferimento, cioè * per puntatore *. – Rapptz

Problemi correlati