2014-10-19 5 views
0

Допустим, у меня есть два файла foo.h и foo.cppизбежать переопределение для заголовка в исходном файле

foo.h

class foo 
{ 
    public: 
     Foo(); 
     ~Foo(); 
    private: 
     /* 
     Member functions 
     */ 
     static void DoThis(); 
     /* 
     Member variables 
     */ 
     static int x; 


    protected: 
}; 

foo.cpp

#include "foo.h" 

int foo::x; 

void foo::DoThis() 
{ 
    x++; 
} 

Могу ли я избежать хлопот, чтобы снова объявить каждую переменную в foo.cpp? Если я удалю эту строку int foo::x;, я бы получил ошибку компоновщика для неразрешенного внешнего символа.

Есть ли другой способ сделать это, не набирая строку для каждой переменной, которую я планирую использовать?

+2

Вы не декларируете ничего в своем файле реализации (.cpp). Вы определяете вещи там. И нет, определение не является необязательным. (Вы могли бы сделать определение функций встроенным, если хотите.) Кроме того: используйте правильные включенные охранники в файле заголовка для защиты от включения нескольких раз. – Deduplicator

+0

'static int & GetX() {static int x = 0; return x; } 'в заголовке. Помните, что компиляторы работают быстрее, когда в заголовке меньше раздувается. –

ответ

1

Вам нужно только повторно объявить статические переменные. Если вы сделаете переменную в определении класса, не делая их статичными, вы можете просто оставить их там. Пример:

foo.h

#ifndef _FOO_H_ 
#define _FOO_H_ 

class Foo{ 
private: 
    static int i; //Static variable shared among all instances 
    int o; //Non-static variable remains unique among all instances 
public: 
    Foo(); //Consructor 
}; 

#endif 

foo.cpp

int Foo::i = 0; //Only static variables can be initialized when in a class 
//No definition required for non-statics 

Foo::Foo(){ 
    //Constructor code here 
    i = 0; 
}; 

Блок #ifndef предотвращает заголовок от случайного включены несколько раз с помощью того же исходного файла. Это в том случае, если заголовок включен в другой заголовок, который, если эти блоки отсутствуют, может привести к бесконечному циклу включения и заставить компилятор завершить работу, когда подсчитывает слишком большую глубину включения.

+0

Защитники заголовков также предотвращают многочисленные ошибки определения –

+0

Право. Спасибо, что напомнили мне об этом, Мэтт. – Midi