2014-10-19 10 views
8

Mam dwie klasy publiczne; jeden statyczny (DesktopOps), jeden niestatyczny (Args) i próbuję zainicjować statyczne zmienne klasy statycznej w main.Kwalifikowany identyfikator w deklaracji przed tokenem = = '

Komunikat o błędzie wciąż otrzymuję to:

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); 
           ^

Oto 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); 
} 

Odpowiedz

12

I naprawdę nie rozumiem, co staramy się robić .... ale zmienne statyczne muszą być tworzone w zakresie globalnym, poza główną funkcją:

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

int main(){ 

} 

Ale to zmienna globalna args nie ma sensu ....

+0

Czuję się jak idiota, bo nie wiem, że statyczny musi być zadeklarowany globalnie (jak inaczej wszyscy to zobaczą, doy), ale jaka zmienna nie ma sensu? (Usunąłem dużo kodu pośredniego btw) – tetris11

+1

Mam na myśli to, że konieczność zadeklarowania globalnej zmiennej Args przy użyciu domyślnego ctor'a tylko po to, aby użyć członków w statycznych instrukcjach window_coords i initial_dims, tylko naprawia twój błąd kompilacji, ale jest bardzo brzydkim sposobem na to. ... Jestem pewna, że ​​lepiej uporządkujesz swój kod. – jpo38

+0

cóż ... o to chodzi, Arg przyjmuje jako argumenty "(int argc, char arv ***)", więc musi być w zasięgu ... ale coś wymyślę – tetris11

6

W strukturze zadeklarować zmienne członków, ale kiedy zdefiniować je można Zrobić to w funkcji, musi być zrobione w globalnym zasięgu, jak

Niestety nie można tego zrobić, ponieważ inicjalizacja zależy od lokalnej zmiennej arg w funkcji main. Oznacza to, że trzeba zrobić definicję i inicjalizację w dwóch etapach:

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, w lewo, aby zrobić kanapkę i wrócił z zwięzły i wyczerpujący rozwiązania. Rozumiem teraz, chociaż nie rozumiem, dlaczego jest to konieczne; tzn. dlaczego kompilator nie robi tego dla mnie? – tetris11

+1

Czy to nie "Arg arg()" deklaracja funkcji? – Mat

+0

to konstruktor zainicjowany zmienną 'arg', nie? – tetris11

Powiązane problemy