2010-06-15 41 views
5

Tôi đang nghiên cứu C++ từ cuốn sách của Schildt và không hoàn toàn hiểu ý nghĩa của nó trong cấu trúc thứ ba; Ai đó có thể giải thích điều này ->C++ Mảng cấu trúc truy cập

Để truy cập một cấu trúc cụ thể trong phạm vi một cấu trúc, bạn phải lập chỉ mục tên cấu trúc. Ví dụ: để hiển thị số thành viên on_hand của cấu trúc thứ ba thứ ba, bạn sẽ viết cout < < invtry [2] .on_hand;

Một số mã:

struct type{ 
char item[40]; 
double cost; 
double retail; 
int on_hand; 
int lead_time; 
}invtry[SIZE]; 
+11

Tôi nghĩ hầu hết mọi người đều coi thường những cuốn sách của Schildt… – hbw

+3

Yup, và đây là một lý do. Bạn phải lập chỉ mục tên mảng, chứ không phải tên cấu trúc. Anh ta có mã đúng nhưng sai lệch. Trong ví dụ, 'invtry' là tên mảng và' type' tên cấu trúc. Theo logic của mình, mã phải là 'cout << type [2] .on_hand'. – MSalters

+2

Nếu bạn hỏi tôi, việc xác định loại và khai báo mảng cùng loại là "không" ở vị trí đầu tiên. –

Trả lời

5

Cấu trúc thứ ba trong một loạt các cấu trúc là một đặt ở vị trí thứ ba trong mảng, ví dụ, một với chỉ số 2.

Trong của bạn (mã xấu xí), invtry được khai báo là một mảng (có kích thước SIZE) của các cấu trúc loại type. Do đó invtry[0] là phần tử đầu tiên, invtry[1] thứ hai và invtry[2] giả định thứ ba, tất nhiên, SIZE >= 3.


Thông thường, bạn sẽ viết:

struct type{ 
char item[40]; 
double cost; 
double retail; 
int on_hand; 
int lead_time; 
}; 

const int SIZE = 500; 

type invtry[SIZE]; 

này đồng nghĩa với những gì bạn đã viết, ngoại trừ định nghĩa của SIZE tất nhiên. Nhưng nó dẫn đến sự nhầm lẫn ít hơn - trong một phần bạn nói những gì một type (tên khủng khiếp cho cấu trúc!) Là - nói cách khác, bạn xác định loại type. Sau đó, bạn tạo một loạt các cấu trúc thuộc loại type, được gọi là invtry.

Làm điều này trong cùng một dòng, như tác giả đã làm, chỉ đơn giản là khủng khiếp - với đôi mắt của tôi.

Bây giờ bạn có một loạt 500 cấu trúc. Nếu "loại" là "Sản phẩm", bạn sẽ có một mảng đại diện cho 500 sản phẩm. Mỗi mục có mục, chi phí, bán lẻ, v.v.

Để truy cập cấu trúc thứ ba trong mảng, hãy viết invtry[2]. để truy cập vào trường on_hand cụ thể của nó, hãy viết invtry[2].on_hand. Điều này không liên quan gì đến vị trí cụ thể của on_hand trong bố cục của loại được xác định.

Nếu bạn muốn lead_time của cấu trúc thứ ba, trước tiên hãy truy cập vào cấu trúc thứ ba và sau đó là thành viên lead_time: invtry[2].lead_time.

Tất nhiên vì loại không có hàm tạo mặc định (không tham số), 500 sản phẩm không được khởi tạo - bạn có rác trong đó. Nhưng đó là vấn đề của bạn.

+0

Vậy là nó như thế struct loại { char item [40]; // 0 đôi chi phí; // 1 bán lẻ gấp đôi; // 2 int on_hand; // 3 int lead_time; // 4 } invtry [SIZE]; – highlevelcoder

+0

@learningtolive Không, điều này là vô nghĩa. Vui lòng đọc phần thứ hai của câu trả lời của tôi. –

+0

Tôi làm cách nào để truy cập thành viên lead_time - theo chỉ mục nào? inv [t] .lead_time – highlevelcoder

1

Thử thay thế 'mục mảng' cho 'cấu trúc'. Vì vậy, để truy cập mục thứ 3 trong mảng invtry (mà là một mảng các cấu trúc), bạn sẽ sử dụng invtry [2] (2 thay vì 3 là chỉ số là 0-based), tiếp theo là biến thành viên bạn muốn đọc ...

tức là invtry [2].on_hand nhận giá trị được giữ trong 'on_hand' của cấu trúc thứ 3 trong mảng 'invtry'

+0

Tôi cá rằng OP bị nhầm lẫn bởi thực tế C mảng là 0 dựa, bỏ phiếu cho bạn. Tôi nghĩ rằng lời giải thích của bạn có thể tốt hơn rất nhiều. :-) – Omnifarious

+0

Cảm ơn, tôi đồng ý với bạn ở đó! Một chút vội vã ... – Dave

0

Bạn không nên cố gắng học từ sách Schildt. Họ rất thiếu sót. Nhiều thông tin trong đó là lỗi thời hoặc sai hết sức nghiêm trọng. Mã được viết theo kiểu xấu và xấu với nhiều chữ C trong đó. xem các đánh giá của ACCU để xem xét chi tiết hơn về các cuốn sách của ông.

Hãy thử "Accelerated C++" của Koenig và Moo hoặc "Nguyên tắc lập trình và thực hành sử dụng C++" của Stroustrup để có hướng dẫn cho người mới bắt đầu.

+0

Còn C++ Primer Plus thì đó là tài liệu tham khảo thứ 2 của tôi? – highlevelcoder

+0

@learning: Tôi chỉ nghe những điều tích cực về C++ Primer Plus! – fredoverflow

+0

Stroustrup không được khuyến khích cho người mới bắt đầu từ những gì tôi nghe? – highlevelcoder

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