。我们有class A
及其派生类; class B
。是否可以在B
中实例化class A
类型的指针?
#ifndef WARRIOR_H
#define WARRIOR_H
#include "CharacterPlayer.h"
class Warrior: public CharacterPlayer
{
public:
virtual void printCharacterName();
};
#endif
但是,当我尝试实例化一个Warrior指针或尝试包含“Warrior.h”时,它会给我一些语法错误。
#ifndef CHARACTERPLAYER_H
#define CHARACTERPLAYER_H
#include "Warrior.h"
class CharacterPlayer
{
public:
Warrior *warriorPntr = nullptr;
virtual void printCharacterName();
};
#endif
答案 0 :(得分:1)
您的标题之间存在循环依赖关系:"CharacterPlayer.h"
包含"Warrior.h"
,"Warrior.h"
包含"CharacterPlayer.h"
。这无法编译,因为" sentinel"将停止包容。
诀窍是在Warrior
中转发声明CharacterPlayer
类,而不是包含标题:
#ifndef CHARACTERPLAYER_H
#define CHARACTERPLAYER_H
class Warrior; // <<== Here
class CharacterPlayer
{
public:
Warrior *warriorPntr = nullptr;
virtual void printCharacterName();
};
#endif
这足以声明指向Warrior
的指针和引用,但不足以调用方法或实例化类。
您最终需要在cpp文件Warrior
中包含CharacterPlayer.cpp
的标头,但这不会导致任何问题,因为标头之间没有循环依赖关系。
答案 1 :(得分:0)
你可以,但这不是一个好主意。
要执行此操作,只需从第二个标题中删除"#include "Warrior.h"
,然后将其替换为"class Warrior;"
至于为什么这是一个坏主意:使基类包含指向派生类(或实例)的指针是一种方式(几种),确保基类的实现依赖于派生类的实现。一般来说,派生类的定义应该依赖于基类,而不是反过来,以避免循环依赖,允许基类以多态方式使用(查找&#34; Liskov替换原则)等。
这意味着,虽然可以做到,但您的设计存在根本缺陷。它会阻止你将来做其他有用的事情。