2013-03-03 5 views
21

У меня возникли проблемы с пониманием того, как передать в структуре (по ссылке) функцию, чтобы функции-члены структуры могли быть заполнены. До сих пор я писал:Передача структур на функции

bool data(struct *sampleData) 
{ 

} 

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

     struct sampleData { 

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

} 

Ошибки я получаю:

C++ требует спецификатор типа для всех деклараций BOOL данных (константные & testStruct)

Я пробовал некоторые примеры объясняются здесь: Simple way to pass temporary struct by value in C++?

Надеюсь, кто-то может мне помочь.

+0

Вы передаете имя типа функции, а не переменной? – billz

+0

Это не по ссылке, это указатель. Вы не создали экземпляр 'sampleData', поэтому он не имеет имени. Кроме того, как существуют данные функции bool, которые должны знать 'sampleData'? – Rapptz

+0

@billz 'sampleData' - это имя моей структуры. Я хочу, чтобы передать эту структуру функции – Phorce

ответ

67

Во-первых, подпись данных() функция:

bool data(struct *sampleData) 

не может работать, потому что аргумент не имеет имени. Когда вы объявляете аргумент функции, который вы намерены фактически получить, ему нужно имя. Поэтому изменить его на что-то вроде:

bool data(struct sampleData *samples) 

Но в C++, вам не нужно использовать struct вообще на самом деле. Так что это может просто стать:

bool data(sampleData *samples) 

Во-вторых, sampleData структура не известна данных() в этой точке. Таким образом, вы должны объявить его до того, что:

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

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

И, наконец, вам нужно создать переменную типа sampleData. Например, в основной функции():

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

Обратите внимание, что вам нужно передать адрес переменных данным функции(), так как она принимает указатель.

Однако обратите внимание, что в C++ вы можете напрямую передавать аргументы по ссылке и не нужно «эмулировать» его указателями. Вы можете это сделать:

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

Необходимо указать способ, тип которого вы используете. В этом случае sampleData.

Примечание: В этом случае вам необходимо определить структуру до того, как метод будет распознан.

Пример:

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

bool data(struct *sampleData) 
{ 

} 

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

     sampleData sd; 
     data(&sd); 

} 

Примечание 2: Я С парнем. Это может быть больше C++.

+0

Теперь я понимаю. Структура «sample_data» должна быть до самой функции? – Phorce

+1

Опять же, это не по ссылке, это * по указателю *. – Rapptz

Смежные вопросы