私のクラスの 2 つは、お互いを含める必要がありました。代わりに前方宣言を行いました。コンパイルは問題ありません。これらのクラスの 1 つの機能は、他のクラスのデストラクタを呼び出すことです。そして、コンパイラが私に警告を吐き出すと、デストラクタは呼び出されません。私に何ができる?必要な関数の別のクラスを作成し、前方宣言を回避することでこの問題を回避できますが、それは私にとって教育的ではありません...
ここに私の最初のクラス Header.h があります:
#ifndef H_HEADER
#define H_HEADER
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include "DataFiles.h"
class Character; // forward declaration Header <-> Character
class Header {
private:
Character * ch;
};
void cleanUp(std::vector <SDL_Surface*> & Vsurface, std::vector <TTF_Font*> & Vfont, std::vector <Character*> & Vchar);
// ... Other functions use in main.cpp
#endif
HEre は Header.cpp です:
#include "Header.h"
using namespace std;
void cleanUp(vector <SDL_Surface*> & Vsurface, vector <TTF_Font*> & Vfont, vector <Character*> & Vchar) {
for(unsigned int i(0); i < Vsurface.size(); i++)
SDL_FreeSurface(Vsurface[i]);
for(unsigned int i(0); i < Vfont.size(); i++)
TTF_CloseFont(Vfont[i]);
for(unsigned int i(0); i < Vchar.size(); i++)
delete Vchar[i];
TTF_Quit();
SDL_Quit();
}
もう 1 つの Character.h クラスは次のとおりです。
#ifndef H_CHARACTER
#define H_CHARACTER
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include </usr/include/SDL/SDL_image.h>
#include </usr/include/SDL/SDL.h>
#include </usr/include/SDL/SDL_ttf.h>
#include "DataFiles.h"
#include "CharFrame.h"
class Header; // Forward declaration Header <-> Character
class Character {
public:
Character(std::string& dataPath);
~Character();
// .. other functions
private:
Header * h;
// ... other attributes
};
#endif
そして、ここに私のキャラクターデストラクタがあります:
Character::~Character() {
cout << "Character " << m_name << " deleted.\n-----------------------------------\n" << endl;
}
したがって、プログラムが終了すると、ヘッダーの関数「cleanUp()」を呼び出して、文字へのポインターのベクトルを渡します。次に、キャラクターのデストラクタ ~Character(); を介してすべてのポインタを削除する必要があります。ただし、コンパイルで 3 つの警告が表示されます。
Header.cpp: In function ‘void cleanUp(std::vector<SDL_Surface*>&, std::vector<_TTF_Font*>&, std::vector<Character*>&)’:
Header.cpp:66:17: warning: possible problem detected in invocation of delete operator: [enabled by default]
Header.cpp:66:17: warning: invalid use of incomplete type ‘struct Character’ [enabled by default]
Header.h:27:7: warning: forward declaration of ‘struct Character’ [enabled by default]
Header.cpp:66:17: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined
そして、私のプログラムが終了すると、キャラクターのデストラクタのメッセージは表示されません。これは、デストラクタが明らかに呼び出されていないことを意味します。
前方宣言で何が間違っていますか?