是否可以在* .cpp文件中实现static
类成员函数而不是执行
它在头文件中?
所有static
函数是否始终为inline
?
答案 0 :(得分:132)
是。
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;
}
它们并不总是内联,不是,但编译器可以制作它们。
答案 1 :(得分:44)
试试这个:
header.hxx:
class CFoo
{
public:
static bool IsThisThingOn();
};
class.cxx:
#include "header.hxx"
bool CFoo::IsThisThingOn() // note: no static keyword here
{
return true;
}
答案 2 :(得分:9)
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 ++如何处理静态函数的更多信息,请访问:Are static member functions in c++ copied in multiple translation units?
答案 3 :(得分:2)
是的,您可以在* .cpp文件中定义静态成员函数。如果在标头中定义它,编译器将默认将其视为内联。但是,这并不意味着可执行文件中将存在静态成员函数的单独副本。请关注此帖以了解有关此内容的更多信息: Are static member functions in c++ copied in multiple translation units?
答案 4 :(得分:1)
@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());
}
答案 5 :(得分:1)
在您的标题文件中说 foo.h
class Foo{
public:
static void someFunction(params..);
// other stuff
}
在您的实施文件中说 foo.cpp
#include "foo.h"
void Foo::someFunction(params..){
// Implementation of someFunction
}
在实施文件中实施静态功能时,请确保不要在方法签名中使用static关键字。
祝你好运
答案 6 :(得分:0)
当然可以。我会说你应该。
这篇文章可能很有用:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
答案 7 :(得分:0)
#include
指令的字面意思是“将该文件中的所有数据复制到此位置”。因此,当您包含头文件时,它在文本中位于代码文件中,并且当代码文件(现在称为编译单元)时,其中的所有内容都将存在,给予或采取其他指令或宏替换的效果em>或转换单元)从预处理器模块传递到编译器模块。
这意味着静态成员函数的声明和定义一直都在同一个文件中......