Чи можливо реалізувати static
функції члена класу у файлі * .cpp замість того, щоб це робити у файлі заголовка?
Чи всі static
функції завжди inline
?
static
ключове слово. Пишіть static
ключове слово лише у визначенні класу у файлі заголовка
Чи можливо реалізувати static
функції члена класу у файлі * .cpp замість того, щоб це робити у файлі заголовка?
Чи всі static
функції завжди inline
?
static
ключове слово. Пишіть static
ключове слово лише у визначенні класу у файлі заголовка
Відповіді:
Це є.
test.hpp:
class A {
public:
static int a(int i);
};
test.cpp:
#include <iostream>
#include "test.hpp"
int A::a(int i) {
return i + 2;
}
using namespace std;
int main() {
cout << A::a(4) << endl;
}
Вони не завжди вбудовані, ні, але компілятор може зробити їх.
helper.hxx
class helper
{
public:
static void fn1 ()
{ /* defined in header itself */ }
/* fn2 defined in src file helper.cxx */
static void fn2();
};
helper.cxx
#include "helper.hxx"
void helper::fn2()
{
/* fn2 defined in helper.cxx */
/* do something */
}
A.cxx
#include "helper.hxx"
A::foo() {
helper::fn1();
helper::fn2();
}
Щоб дізнатися більше про те, як c ++ обробляє статичні функції, відвідайте: Чи копіюються функції статичного члена в c ++ у декількох одиницях перекладу?
Так, ви можете визначити статичні функції членів у файлі * .cpp. Якщо ви визначите це в заголовку, компілятор за замовчуванням вважатиме його як вбудований. Однак це не означає, що окремі копії функції статичного члена будуть існувати у виконуваному файлі. Будь ласка, слідкуйте за цим повідомленням, щоб дізнатись більше про це: Чи копіюються статичні функції членів у c ++ у декількох одиницях перекладу?
inline
або, template
або ви отримаєте кілька помилок визначення від лінкера.
У своєму заголовковому файлі скажіть foo.h
class Foo{
public:
static void someFunction(params..);
// other stuff
}
У вашому файлі реалізації скажіть foo.cpp
#include "foo.h"
void Foo::someFunction(params..){
// Implementation of someFunction
}
Просто переконайтеся, що ви не використовуєте статичне ключове слово у своєму підписі методу, коли ви реалізуєте статичну функцію у вашому файлі реалізації.
Щасти
@crobar, ви маєте рацію, що є багато прикладів з кількома файлами, тому я вирішив поділитися наступним у надії, що це допоможе іншим:
::::::::::::::
main.cpp
::::::::::::::
#include <iostream>
#include "UseSomething.h"
#include "Something.h"
int main()
{
UseSomething y;
std::cout << y.getValue() << '\n';
}
::::::::::::::
Something.h
::::::::::::::
#ifndef SOMETHING_H_
#define SOMETHING_H_
class Something
{
private:
static int s_value;
public:
static int getValue() { return s_value; } // static member function
};
#endif
::::::::::::::
Something.cpp
::::::::::::::
#include "Something.h"
int Something::s_value = 1; // initializer
::::::::::::::
UseSomething.h
::::::::::::::
#ifndef USESOMETHING_H_
#define USESOMETHING_H_
class UseSomething
{
public:
int getValue();
};
#endif
::::::::::::::
UseSomething.cpp
::::::::::::::
#include "UseSomething.h"
#include "Something.h"
int UseSomething::getValue()
{
return(Something::getValue());
}
Звичайно, ви можете. Я б сказав, що ти повинен.
Ця стаття може бути корисною:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
#include
Директива буквально означає «копіювати всі дані в цьому файлі в цьому місці.» Отже, коли ви включаєте файл заголовка, він текстово знаходиться в кодовому файлі, і все, що в ньому буде, буде давати або приймати дію інших директив або макрозамінників, коли файл коду (тепер його називають блоком компіляції або блоком перекладу ) передається з модуля препроцесора в модуль компілятора.
Що означає, що декларація та визначення функції вашого статичного члена справді були в одному файлі весь час ...