2013-06-05 58 views
12

Tôi không biết phải tìm kiếm gì để tìm giải thích cho điều này, vì vậy tôi hỏi.
tôi có mã này mà báo cáo lỗi:`không nêu tên lỗi loại 'trong C++

struct Settings{ 
    int width; 
    int height; 
} settings; 

settings.width = 800; // 'settings' does not name a type error 
settings.height = 600; // 'settings' does not name a type error 

int main(){ 
    cout << settings.width << " " << settings.height << endl; 

nhưng nếu tôi đặt nhiệm vụ giá trị trong chính, nó hoạt động:

struct Settings{ 
    int width; 
    int height; 
} settings; 

main() { 
    settings.width = 800; // no error 
    settings.height = 600; // no error 

Bạn có thể giải thích cho tôi tại sao?

EDIT:
Về câu trả lời Ralph Tandetzky của, đây là mã struct đầy đủ của tôi. Bạn có thể chỉ cho tôi cách gán các giá trị như bạn đã làm với cấu trúc đoạn mã của tôi không?

struct Settings{ 
    struct Dimensions{ 
     int width; 
     int height; 
    } screen; 

    struct Build_menu:Dimensions{ 
     int border_width; 
    } build_menu; 
} settings; 

Trả lời

24

Bạn không thể đặt bài tập bên ngoài ngữ cảnh của hàm trong C++. Nếu bạn đang bối rối bởi thực tế là đôi khi bạn nhìn thấy biểu tượng = được sử dụng bên ngoài bối cảnh của một hàm, chẳng hạn như:

int x = 42; // <== THIS IS NOT AN ASSIGNMENT! 

int main() 
{ 
    // ... 
} 

Đó là bởi vì các biểu tượng = có thể được sử dụng cho khởi là tốt. Trong ví dụ của bạn, bạn không khởi tạo các thành viên dữ liệu widthheight, bạn chỉ định giá trị cho chúng.

+0

wow một vấn đề tinh tế như vậy. chưa bao giờ để ý. điều duy nhất còn thiếu ở đây là tham chiếu std thông thường. là bạn andy hoặc một số người khác đã hack vào tài khoản của Andy? :-) –

+1

Oh damn, awesome. Tôi đang sử dụng khởi tạo quá, vì vậy tôi đã không hiểu tại sao điều này đã không làm việc kể từ khi tôi đã có nhiều biến hơn trước khi cấu trúc này. Vì vậy, hãy rõ ràng. 'int i = 5;' sẽ hoạt động, nhưng 'int i;' theo sau bởi 'i = 5;' sẽ không hoạt động? – Qwerty

+1

@Qwerty: Chính xác –

8

Trong C++ 11 bạn có thể viết

struct Settings { 
    int width; 
    int height; 
} settings = { 800, 600 }; 

để sửa chữa lỗi của bạn. Lỗi xuất hiện bởi vì bạn đang cố gán giá trị bên ngoài nội dung hàm. Bạn có thể khởi tạo nhưng không gán dữ liệu chung bên ngoài một hàm.

EDIT:

Về sửa đổi của bạn, chỉ cần viết

Settings settings = {{800, 600}, {10, 20, 3}}; 

Tôi không chắc chắn 100%, nếu công trình này tuy nhiên, vì sự thừa kế. Tôi khuyên bạn nên tránh thừa kế trong trường hợp này và ghi Dimensions làm dữ liệu thành viên vào cấu trúc Build_menu của bạn. Thừa kế sẽ sớm hay muộn cung cấp cho bạn tất cả các loại rắc rối, khi được sử dụng theo cách này. Prefer composition to inheritance. Khi bạn làm điều đó, nó sẽ trông giống như

Settings settings = {{800, 600}, {{10, 20}, 3}}; 
+0

có thể viết điều này quá 'struct Settings { int width = 10; chiều cao int = 20; } cài đặt; ' –

+0

Oh cảm ơn, về điều này, tôi sẽ có một câu hỏi khác. Cấu trúc tôi đăng chỉ là một đoạn của cấu trúc thực sự của tôi. Tôi sẽ cập nhật câu hỏi của tôi, bạn sẽ rất tử tế và xem làm thế nào tôi có thể làm cho nó hoạt động bằng cách sử dụng này assignmenet? Tôi xác định cấu trúc của tôi ở đầu của main.cpp của tôi (sau khi bao gồm tất nhiên) vì vậy nó là điều đầu tiên nhìn thấy trong mã của tôi. Đó là lý do tại sao tôi thích bảng gán giá trị như vậy, thay vì trong main() trên dòng thứ 300. – Qwerty

+0

@Qwerty đây chỉ là khởi tạo. thses thiết lập cấu trúc của bạn thành một số giá trị ban đầu để bạn biết trạng thái của các thành viên này. sau đó bạn có thể thay đổi nó accoringly trong chương trình. \ –

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