2013-03-03 54 views
21

Tôi gặp khó khăn khi hiểu cách chuyển cấu trúc (theo tham chiếu) đến hàm để các hàm thành viên của cấu trúc có thể được điền. Cho đến nay tôi đã viết:Truyền các cấu trúc đến các hàm

bool data(struct *sampleData) 
{ 

} 

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

     struct sampleData { 

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

} 

Các lỗi tôi nhận được là:

C++ đòi hỏi một Bộ xác định kiểu cho tất cả các tờ khai dữ liệu bool (const & testStruct)

Tôi đã cố gắng một số ví dụ được giải thích tại đây: Simple way to pass temporary struct by value in C++?

Hy vọng ai đó có thể giúp tôi.

+0

bạn đang chuyển tên kiểu cho hàm không phải là biến? – billz

+0

Đó không phải là tham chiếu, đó là bằng con trỏ. Bạn đã không tạo một thể hiện của 'sampleData' để nó không có tên. Ngoài ra, dữ liệu bool chức năng được cho là biết 'sampleData' tồn tại như thế nào? – Rapptz

+0

@billz 'sampleData' là tên cấu trúc của tôi. Tôi muốn có thể chuyển cấu trúc này đến hàm – Phorce

Trả lời

67

Thứ nhất, chữ ký của dữ liệu của bạn() chức năng:

bool data(struct *sampleData) 

không thể nào làm việc, bởi vì lập luận thiếu một tên. Khi bạn khai báo một đối số hàm mà bạn định thực sự truy cập, nó cần một tên. Vì vậy, hãy thay đổi nó thành một cái gì đó như:

bool data(struct sampleData *samples) 

Nhưng trong C++, bạn không cần sử dụng struct thực sự. Vì vậy, đây chỉ đơn giản là có thể trở thành:

bool data(sampleData *samples) 

Thứ hai, struct sampleData không biết đến dữ liệu() tại điểm đó. Vì vậy, bạn nên khai báo trước đó:

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

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

Và cuối cùng, bạn cần phải tạo một biến loại sampleData. Ví dụ: trong hàm main() của bạn:

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

Lưu ý rằng bạn cần chuyển địa chỉ của biến sang hàm data(), vì nó chấp nhận con trỏ.

Tuy nhiên, lưu ý rằng trong C++ bạn có thể trực tiếp chuyển đối số theo tham chiếu và không cần phải "mô phỏng" đối số bằng con trỏ. Bạn có thể thực hiện việc này thay thế:

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

Bạn cần phải cho biết phương pháp loại cấu trúc bạn đang sử dụng. Trong trường hợp này, sampleData.

Lưu ý: Trong trường hợp này, bạn sẽ cần xác định cấu trúc trước khi phương thức cho nó được nhận dạng.

Ví dụ:

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

bool data(struct *sampleData) 
{ 

} 

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

     sampleData sd; 
     data(&sd); 

} 

Note 2: Tôi là một chàng trai C. Có thể có một cách C++ ish để làm điều này.

+0

Tôi hiểu ngay bây giờ. Cấu trúc "sample_data" phải ở trước chính hàm đó? – Phorce

+1

Một lần nữa, đây không phải là tham chiếu, đó là * theo con trỏ *. – Rapptz

Các vấn đề liên quan