Не могли бы вы объяснить, почему вы «НЕ МОЖЕТЕ» реализовать функцию члена статического класса в вашем файле cpp? какая-нибудь ошибка? Обычно нет ограничений относительно того, где вы реализуете такую функцию.
winterTTr
7
@winterTTr, вопрос, вероятно, возник из-за того, что большинство примеров / руководств в сети не представляют отдельный пример реализации, вместо этого объявляя и определяя его в заголовке. По крайней мере, первые шесть совпадений в моей любимой поисковой системе для "статической функции-члена C ++" делают это таким образом и не объясняют, как вы реализуете ее в отдельных файлах для новичков.
Crobar
8
При реализации не повторяйте staticключевое слово. Пишите staticключевое слово только в определении класса в заголовочном файле
SomethingSomething
@crobar, вы правы, что многофайловых примеров мало. Я изо всех сил пытался понять это, поэтому я решил поделиться следующим:
Да, вы можете определять статические функции-члены в файле * .cpp. Если вы определите его в заголовке, компилятор по умолчанию будет рассматривать его как встроенный. Однако это не означает, что в исполняемом файле будут существовать отдельные копии статической функции-члена. Пожалуйста, следите за этим сообщением, чтобы узнать больше об этом:
Копируются ли статические функции-члены в C ++ в нескольких единицах перевода?
Если вы определите его в теле класса, он автоматически станет значением по умолчанию. Если это в заголовке вне тела класса, то лучше быть маркированы как inlineили , templateили вы получите несколько ошибок определения из компоновщика.
Ben Voigt
2
В вашем заголовочном файле скажите foo.h
classFoo{public:staticvoid someFunction(params..);// other stuff}
В вашем файле реализации скажите foo.cpp
#include"foo.h"voidFoo::someFunction(params..){// Implementation of someFunction}
Очень важно
Просто убедитесь, что вы не используете ключевое слово static в сигнатуре метода при реализации статической функции в файле реализации.
#includeДиректива буквально означает «копировать все данные в этом файле в этом месте.» Поэтому, когда вы включаете файл заголовка, он в текстовом виде находится внутри файла кода, и все в нем будет там, добавляя или принимая эффект других директив или замен макросов, когда файл кода (теперь называемый единицей компиляции или единицей перевода ) передается из модуля препроцессора в модуль компилятора.
Это означает, что объявление и определение вашей статической функции-члена действительно все время находились в одном файле ...
static
ключевое слово. Пишитеstatic
ключевое слово только в определении класса в заголовочном файлеОтветы:
Это.
test.hpp:
test.cpp:
Они не всегда встроены, нет, но компилятор может их создать.
источник
Попробуй это:
header.hxx:
class.cxx:
источник
helper.hxx
helper.cxx
A.cxx
Чтобы узнать больше о том, как С ++ обрабатывает статические функции, посетите: Копируются ли статические функции-члены в С ++ в нескольких единицах перевода?
источник
Да, вы можете определять статические функции-члены в файле * .cpp. Если вы определите его в заголовке, компилятор по умолчанию будет рассматривать его как встроенный. Однако это не означает, что в исполняемом файле будут существовать отдельные копии статической функции-члена. Пожалуйста, следите за этим сообщением, чтобы узнать больше об этом: Копируются ли статические функции-члены в C ++ в нескольких единицах перевода?
источник
inline
или ,template
или вы получите несколько ошибок определения из компоновщика.В вашем заголовочном файле скажите foo.h
В вашем файле реализации скажите foo.cpp
Очень важно
Просто убедитесь, что вы не используете ключевое слово static в сигнатуре метода при реализации статической функции в файле реализации.
Удачи
источник
@crobar, вы правы, что многофайловых примеров не хватает, поэтому я решил поделиться следующими в надежде, что это поможет другим:
источник
Что вы можете. Я бы сказал, что вам следует.
Эта статья может быть полезной:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
источник
#include
Директива буквально означает «копировать все данные в этом файле в этом месте.» Поэтому, когда вы включаете файл заголовка, он в текстовом виде находится внутри файла кода, и все в нем будет там, добавляя или принимая эффект других директив или замен макросов, когда файл кода (теперь называемый единицей компиляции или единицей перевода ) передается из модуля препроцессора в модуль компилятора.Это означает, что объявление и определение вашей статической функции-члена действительно все время находились в одном файле ...
источник