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?
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. –
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
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