2013-03-03 18 views
21

Mam problem ze zrozumieniem, jak przekazywać strukturę (przez odniesienie) do funkcji, aby funkcje członków struktury mogły zostać wypełnione. Do tej pory pisałem:Przekazywanie struktur do funkcji

bool data(struct *sampleData) 
{ 

} 

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

     struct sampleData { 

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

} 

Błąd pojawia się:

C++ wymaga specyfikacja typu dla wszystkich zgłoszeń dane bool (const & testStruct)

Próbowałem kilka przykładów wyjaśnionych tutaj: Simple way to pass temporary struct by value in C++?

Mam nadzieję, że ktoś może mi pomóc.

+0

przekazujesz nazwę typu do funkcji, która nie jest zmienną? – billz

+0

To nie przez odniesienie, to przez wskaźnik. Nie stworzyłeś instancji 'sampleData', więc nie ma ona nazwy. Ponadto, w jaki sposób funkcja bool danych ma znać "sampleData" istnieje? – Rapptz

+0

@billz 'sampleData' to nazwa mojej struktury. Chcę móc przekazać tę strukturę do funkcji – Phorce

Odpowiedz

67

Najpierw podpis danych() funkcja:

bool data(struct *sampleData) 

nie mogą ewentualnie pracować, ponieważ argument brakuje nazwy. Kiedy deklarujesz argument funkcji, do którego masz zamiar uzyskać dostęp, potrzebujesz nazwy. Więc go zmienić na coś takiego:

bool data(struct sampleData *samples) 

Ale w C++, nie trzeba używać struct w ogóle faktycznie. Więc może po prostu stać:

bool data(sampleData *samples) 

drugie, sampleData struct nie jest znany danych() w tym punkcie. Należy więc uznać je wcześniej:

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

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

I wreszcie, trzeba utworzyć zmienną typu sampleData. Na przykład, w głównej() Funkcja:

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

Należy pamiętać, że trzeba przekazać adres zmiennej do danych funkcji(), ponieważ przyjmuje się wskaźnik.

Należy jednak zauważyć, że w C++ można bezpośrednio przekazywać argumenty przez odniesienie i nie trzeba ich "emulować" za pomocą wskaźników. Możesz to zrobić zamiast:

// 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) 
{ 
} 

Musisz podać metodę, z jakiego rodzaju struktury korzystasz. W tym przypadku sampleData.

Uwaga: W tym przypadku będziesz musiał zdefiniować strukturę przed metodą, która ma zostać rozpoznana.

Przykład:

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

bool data(struct *sampleData) 
{ 

} 

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

     sampleData sd; 
     data(&sd); 

} 

Uwaga 2: Jestem C facet. Może być więcej C++ sposobu na zrobienie tego.

+0

Rozumiem teraz. Struktura "sample_data" powinna znajdować się przed samą funkcją? – Phorce

+1

Jeszcze raz nie jest to przez odniesienie, to * przez wskaźnik *. – Rapptz

Powiązane problemy