C ++: избегайте файлов .cpp только с пустым (de) конструктором - PullRequest
1 голос
/ 17 июня 2010

Когда у меня есть такой заголовочный файл:

#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 для пустого конструктора и деконструктора.Я хочу реализовать этот метод просто в заголовочном файле.Это намного чище.

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

Ответы [ 4 ]

8 голосов
/ 17 июня 2010

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

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

 virtual void Update() = 0;
 virtual void Render(SDL_Surface* buffer) = 0;
};
4 голосов
/ 17 июня 2010

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

Да будет так.

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

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

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

1 голос
/ 17 июня 2010

Я не вижу вашей проблемы:

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

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

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

1 голос
/ 17 июня 2010
#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_ */
...