2014-09-22 10 views
12

Realizując klasę do tworzenia/aktualizowania pól na ekranie, chciałem dodać statyczną funkcję członka, który sprawia, że ​​na pewno nie ma obecnie widoczne skrzynki pokrywają się (biorąc swoje informacje od statycznej tablicy wskaźnika dla wszystkich widocznych pól)Dlaczego funkcja statycznego elementu może być zadeklarowana jako statyczna w definicji klasy, a nie w jej własnej definicji?

Mój początkowy kod miał następującą strukturę:

class Box 
{ 
public: 
    // ... 
    static void arrangeOverlappingBoxes(); 
}; 

static void Box::arrangeOverlappingBoxes() 
{ 
    // ... 
} 

byłem bardzo zaskoczony, że ten wygenerował błąd C2724: „static” nie powinien być stosowany na funkcji składowych określonych w zakresie plików.

Z pewnym badaniu, Google i błędów, zorientowałem się, że moja definicja funkcja powinna stracić słowa kluczowego static, to znaczy należy

void Box::arrangeOverlappingBoxes() 
{ 
    // ... 
} 

Jeszcze nie mam pojęcia co Uzasadnieniem tego może być. Wydaje się, że jest tak asymetryczna i myląca, że ​​ma inny nagłówek funkcji dla swojej deklaracji w definicji klasy i jej własnej definicji. Czy jest jakikolwiek powód?

Odpowiedz

7

definicji klasy (w pliku nagłówkowym) zapewni funkcję z cokolwiek propreties które są konieczne:

  • statyczny
  • inlined
  • wirtualny

Biorąc pod uwagę, że każdy Kolejnym celem będzie spójrz na definicję klasy za pomocą .h, wtedy ma sens, aby te właściwości były tam zdefiniowane.

Co więcej, każda funkcja z klasy będzie zachowywać własność w klasach pochodnych (na przykład musisz zadeklarować destruktor wirtualnie tylko w klasie bazowej, każde kolejne dziedziczenie podejmie destruktor jako wirtualny).

Nie ma sensu redeclare te właściwości w korpusu implementacji.

Konieczność deklarowania właściwości funkcji zarówno w plikach .h, jak i .cpp doprowadziłaby w rzeczywistości do wielu problemów. Wyobraź sobie ten scenariusz: deklarujesz funkcję jako wirtualną w pliku .h oraz jako statyczną w pliku .cpp. Jaką funkcję wykona kompilator? wirtualny czy statyczny? (lub bardziej prawdopodobny błąd kompilacji, ale błąd kompilatora będzie po prostu wymagał dopasowania w pliku .cpp deklaracji w nagłówku Nie można przeciążać funkcji według "statycznego" lub "wirtualnego").

+0

Dziękuję za odpowiedź, ale nadal nie rozumiem. Kompilator może zostać zaprogramowany tylko po to, aby skompilować na wypadek, gdyby atrybuty były takie same, podobnie jak parametry powinny być równe (faktycznie, składnia Java wymaga, aby tak było). Dlaczego miałbyś powiedzieć, że to nie ma sensu? Moim skromnym zdaniem ma to wiele sensu: jeśli po prostu zajrzysz do pliku cpp (zakładając, że definicja twojej klasy znajduje się w nagłówku), natychmiast zobaczysz, że funkcja jest statyczna i na przykład nie ma tego wskaźnika bez konieczności szukania w pliku nagłówkowym. –

+0

Pomyśl o tym w ten sposób: jakie problemy pojawią się, jeśli możesz określić typ funkcji w obu .cpp i .h? Zobaczysz, że kompilator faktycznie zmusiłby cię w twoim .cpp do implementacji funkcji z tą samą właściwością, co w pliku nagłówkowym, w przeciwnym razie otrzymasz nierozwiązany zewnętrzny błąd powiązania symbolu (pamiętaj, że wszystkie klasy zewnętrzne łączą się z definicją funkcja z nagłówka). Konieczne byłoby zatem, aby w pliku cpp również zadeklarować tę własność.C++ jest na tyle złożony, że nie wymaga dodatkowych wyzwań;). – MichaelCMS

+0

Odnośnie edytowanego komentarza: możesz użyć konwencji nazewnictwa lub komentarzy, aby podkreślić "statyczny" lub takie atrybuty. Osobiście zaglądam do plików nagłówkowych, jeśli chodzi o typy metod (masz do zrobienia deklarację i przejdź do definicji) ... Może to kwestia stylu – MichaelCMS

Powiązane problemy