gpt4 book ai didi

C++ 前向声明和析构函数

转载 作者:太空狗 更新时间:2023-10-29 21:45:02 25 4
gpt4 key购买 nike

我的两个类(class)必须相互包含。我做了前向声明,编译没问题。这些类的一个功能是调用另一个的析构函数。而且编译器向我发出警告,不会调用析构函数。我能做什么?我可以通过为我需要的函数创建另一个类来避免这个问题,避免前向声明,但这对我来说没有教育意义......

这是我的第一个类 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

这是 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();

}

这是另一个 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;

}

因此,当我的程序结束时,我调用 Header 的函数“cleanUp()”,为它提供一个指向字符的指针 vector 。然后应该通过 Character 的析构函数 ~Character(); 删除每个指针。但是编译给了我三个警告:

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

一旦我的程序终止,角色的析构函数消息将不会显示,这意味着析构函数显然没有被调用。

我在前向声明中做错了什么?

最佳答案

是的,标准(草案)就是这么说的(§5.3.5.5);

If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.

(一个非平凡的析构函数是你自己定义的)

要修复它,只需在 header.cpp#include "Character.h" 调用 delete 以允许类型完全声明。

关于C++ 前向声明和析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18550304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com