Bagaimana cara menerapkan fungsi anggota kelas statis di file * .cpp?


125

Apakah mungkin untuk mengimplementasikan staticfungsi anggota kelas di file * .cpp daripada melakukannya di file header?

Apakah semua staticfungsi selalu inline?


4
Bisakah Anda menjelaskan mengapa Anda "TIDAK DAPAT" menerapkan fungsi anggota kelas statis di file cpp Anda? ada kesalahan? Biasanya tidak ada batasan tentang di mana Anda mengimplementasikan fungsi tersebut.
winterTTr

7
@winterTTr, Pertanyaan tersebut mungkin muncul karena kebanyakan contoh / tutorial di web tidak menyajikan contoh implementasi terpisah, melainkan mendeklarasikan dan mendefinisikannya di header. Setidaknya enam hit pertama di mesin pencari favorit saya untuk "C ++ fungsi anggota statis" semua melakukannya dengan cara ini dan tidak menjelaskan bagaimana Anda menerapkannya dalam file terpisah untuk pemula.
crobar

8
Saat Anda menerapkan, jangan ulangi statickata kunci tersebut. Tuliskan statickata kunci hanya dalam definisi kelas di file header
SomethingSomething

@crobar, Anda benar bahwa ada kelangkaan contoh multi-file. Saya kesulitan untuk memikirkannya, jadi saya memutuskan untuk membagikan yang berikut:
Don Mclachlan

Jawaban:


154

Ini.

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

Mereka tidak selalu sebaris, tidak, tetapi kompilator dapat membuatnya.


47

Coba ini:

header.hxx:

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

class.cxx:

#include "header.hxx"
bool CFoo::IsThisThingOn() // note: no static keyword here
{
    return true;
}

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

Untuk mengetahui lebih lanjut tentang bagaimana c ++ menangani fungsi statis kunjungi: Apakah fungsi anggota statis di c ++ disalin dalam beberapa unit terjemahan?


2

Ya, Anda dapat menentukan fungsi anggota statis di file * .cpp. Jika Anda mendefinisikannya di header, compiler secara default akan memperlakukannya sebagai inline. Namun, ini tidak berarti salinan terpisah dari fungsi anggota statis akan ada di file yang dapat dieksekusi. Silakan ikuti posting ini untuk mempelajari lebih lanjut tentang ini: Apakah fungsi anggota statis di c ++ disalin di beberapa unit terjemahan?


Jika Anda menentukannya di badan kelas, ini akan menjadi default secara otomatis. Jika ada di header di luar badan kelas, sebaiknya ditandai inlineatau templateatau Anda akan mendapatkan beberapa kesalahan definisi dari linker.
Ben Voigt

2

Di file header Anda, ucapkan foo.h

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

Dalam file implementasi Anda, katakan foo.cpp

#include "foo.h"

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

Sangat penting

Pastikan Anda tidak menggunakan kata kunci statis di tanda tangan metode Anda saat Anda menerapkan fungsi statis di file implementasi Anda.

Semoga berhasil


1

@crobar, Anda benar bahwa ada kelangkaan contoh multi-file, jadi saya memutuskan untuk membagikan yang berikut dengan harapan dapat membantu orang lain:

::::::::::::::
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());
}


0

The #includedirektif secara harfiah berarti "menyalin semua data dalam file ke tempat ini." Jadi ketika Anda menyertakan file header, file itu secara tekstual di dalam file kode, dan semua yang ada di dalamnya akan ada di sana, memberi atau mengambil efek dari direktif atau penggantian makro lainnya, ketika file kode (sekarang disebut unit kompilasi atau unit terjemahan ) adalah diserahkan dari modul preprocessor ke modul compiler.

Yang berarti deklarasi dan definisi fungsi anggota statis Anda benar-benar ada di file yang sama selama ini ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.