如何在* .cpp文件中实现静态类成员函数?

时间:2011-03-21 01:58:50

标签: c++

是否可以在* .cpp文件中实现static类成员函数而不是执行 它在头文件中?

所有static函数是否始终为inline

8 个答案:

答案 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指令的字面意思是“将该文件中的所有数据复制到此位置”。因此,当您包含头文件时,它在文本中位于代码文件中,并且当代码文件(现在称为编译单元转换单元)从预处理器模块传递到编译器模块。

这意味着静态成员函数的声明和定义一直都在同一个文件中......