Jak zaimplementować statyczne funkcje składowe klasy w pliku * .cpp?

125

Czy można zaimplementować staticfunkcje składowe klasy w pliku * .cpp zamiast robić to w pliku nagłówkowym?

Czy wszystkie staticfunkcje są zawsze inline?

BartoszKP
źródło
4
Czy możesz wyjaśnić, dlaczego „NIE MOŻESZ” zaimplementować statycznej funkcji memeber klasy w swoim pliku CPP? jakiś błąd? Zwykle nie ma ograniczeń co do miejsca implementacji takiej funkcji.
zimaTTr
7
@winterTTr, Pytanie prawdopodobnie powstało, ponieważ większość przykładów / tutoriali w sieci nie przedstawia oddzielnego przykładu implementacji, zamiast tego deklaruje i definiuje go w nagłówku. Przynajmniej sześć pierwszych trafień mojej ulubionej wyszukiwarki na „statyczną funkcję składową w C ++” robi to w ten sposób i nie wyjaśnia, w jaki sposób można ją zaimplementować w osobnych plikach dla nowicjusza.
crobar
8
Podczas implementacji nie powtarzaj staticsłowa kluczowego. Wpisz staticsłowo kluczowe tylko w definicji klasy w pliku nagłówkowym
SomethingSomething
@crobar, masz rację, że brakuje przykładów złożonych z wielu plików. Trudno mi było to
rozgryźć

Odpowiedzi:

154

To jest.

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;
}

Nie zawsze są one wbudowane, nie, ale kompilator może je stworzyć.

CromTheDestroyer
źródło
47

Spróbuj tego:

header.hxx:

class CFoo
{
public: 
    static bool IsThisThingOn();
};

class.cxx:

#include "header.hxx"
bool CFoo::IsThisThingOn() // note: no static keyword here
{
    return true;
}
Paulcam
źródło
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();
}

Aby dowiedzieć się więcej o tym, jak c ++ obsługuje funkcje statyczne, odwiedź: Czy statyczne funkcje składowe w języku c ++ są kopiowane w wielu jednostkach tłumaczeniowych?

Rizz Rocks
źródło
2

Tak, możesz zdefiniować statyczne funkcje składowe w pliku * .cpp. Jeśli zdefiniujesz to w nagłówku, kompilator domyślnie potraktuje to jako wbudowane. Nie oznacza to jednak, że w pliku wykonywalnym będą istniały oddzielne kopie statycznej funkcji składowej. Proszę śledzić ten post, aby dowiedzieć się więcej na ten temat: Czy statyczne funkcje składowe w języku c ++ są kopiowane w wielu jednostkach tłumaczeniowych?

cppcoder
źródło
Jeśli zdefiniujesz go w treści klasy, automatycznie będzie to wartość domyślna. Jeśli znajduje się w nagłówku poza treścią klasy, lepiej oznacz go albo inlinealbo templateotrzymasz wiele błędów definicji z konsolidatora.
Ben Voigt,
2

W pliku nagłówkowym powiedz foo.h

class Foo{
    public:
        static void someFunction(params..);
    // other stuff
}

W pliku implementacji wpisz foo.cpp

#include "foo.h"

void Foo::someFunction(params..){
    // Implementation of someFunction
}

Bardzo ważne

Po prostu upewnij się, że nie używasz słowa kluczowego static w sygnaturze metody podczas implementowania funkcji statycznej w pliku implementacji.

Powodzenia

Pan Suryaa Jha
źródło
1

@crobar, masz rację, że brakuje przykładów złożonych z wielu plików, więc postanowiłem podzielić się następującymi informacjami w nadziei, że pomoże to innym:

::::::::::::::
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());
}
Don Mclachlan
źródło
0

#includeDyrektywa dosłownie oznacza „skopiować wszystkie dane z tego pliku do tego miejscu.” Więc kiedy włączysz plik nagłówkowy, jest on tekstowo w pliku kodu i wszystko w nim będzie tam, daje lub przyjmuje skutek innych dyrektyw lub zamian makr, gdy plik kodu (teraz nazywany jednostką kompilacji lub jednostką tłumaczenia ) jest przekazane z modułu preprocesora do modułu kompilatora.

Co oznacza, że ​​deklaracja i definicja Twojej statycznej funkcji składowej przez cały czas znajdowały się w tym samym pliku ...

Blair Houghton
źródło