2010-06-17 1 views
1

Когда у меня есть заголовочный файл, как это:C++: Избегайте .cpp файлы только с пустым (де) конструктором

#ifndef GAMEVIEW_H_ 
#define GAMEVIEW_H_ 

#include <SDL/SDL.h> 

class GameView 
{ 
public: 
GameView(); 
virtual ~GameView(); 

virtual void Update() = 0; 
virtual void Render(SDL_Surface* buffer) = 0; 
}; 

#endif /* GAMEVIEW_H_ */ 

Мне нужно создать .cpp файл так:

#include "GameView.h" 

GameView::~GameView() 
{ 

} 

GameView::GameView() 
{ 
} 

Это немного глупо. Просто файл .cpp для пустого конструктора и деконструктора. Я хочу реализовать этот метод просто в файле заголовка. Это намного чище.

Как это сделать?

+0

Я, хотя я это пробовал, и у меня были ошибки компиляции. Теперь я больше не получаю ошибок. Спасибо всем. –

ответ

8

Вы можете определить конструктор и деструктор (это правильный термин, использовать это вместо Разрушителя) инлайн:

class GameView 
{ 
public: 
GameView() {} 
virtual ~GameView() {} 

virtual void Update() = 0; 
virtual void Render(SDL_Surface* buffer) = 0; 
}; 
1
#ifndef GAMEVIEW_H_ 
#define GAMEVIEW_H_ 

#include <SDL/SDL.h> 

class GameView 
{ 
public: 
GameView() {} 
virtual ~GameView() {} 

virtual void Update() = 0; 
virtual void Render(SDL_Surface* buffer) = 0; 
}; 

#endif /* GAMEVIEW_H_ */ 
1

Я не вижу проблему:

class GameView 
{ 
public: 
GameView() {} 
virtual ~GameView() {} 

virtual void Update() = 0; 
virtual void Render(SDL_Surface* buffer) = 0; 
}; 

И, конечно, если конструктор ничего не делает, нет необходимости предоставлять все это.

4

Я хочу реализовать этот метод просто в файле заголовка. Это намного чище.

Так будет.

// ... 
GameView() { } 
virtual ~GameView() { } 
// ... 

Вам даже не нужно писать это. Компилятор предоставляет конструктор по умолчанию. Единственное, что вам нужно, это деструктор, потому что по умолчанию он не виртуальный.

Если вы слышали, что вам нужно определить их в файле .cpp, это иногда необходимо, если у вас есть интеллектуальные указатели в вашем классе как члены. Эмпирическое правило состоит в том, что когда у вас есть интеллектуальные указатели в вашем классе, и они указывают на класс, который просто объявлен в заголовке, всегда предоставляйте конструкторы и деструкторы в файле .cpp, где вы фактически определяете класс с указателем. В противном случае у вас могут возникнуть проблемы с удалением неполных классов (во многих случаях это вызывает неопределенное поведение).

+0

+1 для ловушки – neuro