2014-10-19 45 views
8

Tôi có hai lớp công khai; một tĩnh (DesktopOps), một tĩnh (Args), và tôi đang cố khởi tạo các biến tĩnh của lớp tĩnh trong chính.ID hợp lệ trong khai báo trước mã thông báo '='

Thông báo lỗi tôi tiếp tục nhận được là:

main.cpp:25: error: qualified-id in declaration before '=' token 
    Point DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
            ^
main.cpp:26: error: qualified-id in declaration before '=' token 
    Point DesktopOps::window_dims = Point(arg.width, arg.height); 
           ^

Dưới đây là một MWe:

#include <opencv2/opencv.hpp> 

using namespace cv; 

struct Args{ 
    int topleft_x, topleft_y, width, height; 

    Args(){ 
     topleft_x = topleft_y = width = height = -1; 
    } 
}; 


struct DesktopOps { 
    static Point window_coords; 
    static Point window_dims; 

}; 



int main(){ 
    Args arg(); 

    Point DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
    Point DesktopOps::window_dims = Point(arg.width, arg.height); 
} 

Trả lời

12

Tôi không thực sự hiểu những gì bạn đang cố gắng .... nhưng biến tĩnh phải được tạo trong phạm vi toàn cầu, bên ngoài chức năng chính:

Args arg; 
Point DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
Point DesktopOps::window_dims = Point(arg.width, arg.height); 

int main(){ 

} 

Nhưng biến args toàn cầu này không có ý nghĩa ....

+0

Tôi cảm thấy như một thằng ngốc vì không biết rằng tĩnh phải được khai báo trên toàn cầu (tất cả các thành viên khác sẽ thấy nó như thế nào, doy), nhưng biến nào không có ý nghĩa? (Tôi đã xóa rất nhiều mã trung gian btw) – tetris11

+1

Tôi có nghĩa là phải khai báo biến toàn cầu Args bằng cách sử dụng ctor mặc định chỉ để sử dụng các thành viên trong static window_coords và khởi tạo window_dims chỉ sửa lỗi biên dịch của bạn nhưng là một cách rất xấu xí để làm điều đó. ... Tôi rất chắc chắn bạn sẽ sắp xếp mã của mình tốt hơn. – jpo38

+0

cũng ... đây là điều, Arg acually mất như '(int argc, char arv ***)' làm đối số, do đó, nó cần phải được trong chính .... nhưng tôi sẽ tìm một cái gì đó ra – tetris11

6

Trong cấu trúc bạn tuyên bố các biến thành viên, nhưng khi bạn xác định chúng, bạn có thể 't làm điều đó trong một chức năng, nó phải được thực hiện trong phạm vi toàn cầu, như

struct DesktopOps { 
    static Point window_coords; 
    static Point window_dims; 
}; 

Point DesktopOps::window_coords = Point(someX, someY); 
Point DesktopOps::window_dims = Point(someW, someH); 

int main() 
{ 
    // ... 
} 

Thật không may là điều này không thể thực hiện được kể từ khi khởi tạo phụ thuộc vào biến số arg cục bộ trong hàm main. Điều này có nghĩa là bạn phải thực hiện định nghĩa và khởi tạo theo hai bước:

struct DesktopOps { 
    static Point window_coords; 
    static Point window_dims; 
}; 

Point DesktopOps::window_coords; 
Point DesktopOps::window_dims; 

int main() 
{ 
    Args arg; 

    DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
    DesktopOps::window_dims = Point(arg.width, arg.height); 
} 
+0

wow, còn lại để làm cho một chiếc bánh sandwich và trở lại với một giải pháp ngắn gọn và thông tin. Tôi hiểu bây giờ, mặc dù tôi không hiểu tại sao điều này là cần thiết; tức là tại sao trình biên dịch không làm điều này cho tôi? – tetris11

+1

Đó không phải là 'Arg arg() 'một khai báo hàm? – Mat

+0

đó là hàm tạo khởi tạo biến 'arg', không? – tetris11

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