从派生类调用基类函数时出现的问题 我现在对C++非常陌生,我已经开始学习如何在路径查找算法中使用指针。

从派生类调用基类函数时出现的问题 我现在对C++非常陌生,我已经开始学习如何在路径查找算法中使用指针。,c++,derived-class,private-members,C++,Derived Class,Private Members,我在调用从基类派生的类中的函数时遇到问题 导致问题的具体代码是: FreeTile *tempPointer = new FreeTile(); cout<<tempPointer->getFree()<<endl; mapp[i][j] = tempPointer; 磁贴标题为: #ifndef TILE_H #定义TILE_H class Tile { public: Tile(); virtual ~Tile();

我在调用从基类派生的类中的函数时遇到问题

导致问题的具体代码是:

FreeTile *tempPointer = new FreeTile();
cout<<tempPointer->getFree()<<endl;
mapp[i][j] = tempPointer;
磁贴标题为: #ifndef TILE_H #定义TILE_H

class Tile
 {
    public:
        Tile();
        virtual ~Tile();
        bool getFree();
        void setFree(bool bo);
    protected:
    private:
        bool free;
};

#endif // TILE_H
#endif // FREETILE_H
最后,为磁贴创建cpp文件:

#include "Tile.h"
#include <iostream>
using namespace std;

bool free;


Tile::Tile()
{
    cout<<"Constructor Called"<<endl;
}

Tile::~Tile()
{
    //dtor
}

bool getFree(){
    return free;
}

void setFree(bool bo){
    free = bo;
}
#包括“Tile.h”
#包括
使用名称空间std;
无布尔;
Tile::Tile()
{
cout在Cpp文件中将“bool getFree()”重命名为
“布尔平铺::getFree()”

在您的实现中,该函数只是一个常规的c gloabl函数。 在固定版本中,它是您在头文件中声明的函数的类函数实现

也 首先在你的互动程序中有一个私有变量“bool free” 在cpp文件中有一个全局变量“bool free” 这令人困惑。 可能要删除您在cpp文件中声明的一个

想要更深入的解释吗?

是的!我的第一个答案! 更深入的解释: 您在类Tile中声明的函数未定义(仅声明),因为您没有在cpp文件中的函数定义之前添加“Tile::”(即,您没有定义作用域)。 您在cpp文件中编写的函数在cpp文件中定义和声明,因此只有在cpp文件中在它之后编写的函数才能调用它(与c的工作原理相同)。 可能在编写函数时,它不知道“free”是什么,对吧?因为它不是一个类函数。因此,您添加了全局“bool free”,但这是一个完全不同的变量。 很乐意帮忙!
别忘了将此标记为已回答!

这里有很多错误。您已将
free
定义为全局变量,并将
getFree
setFree
定义为全局变量。在
FreeTile
中,您的变量
free
将从
Tile
中隐藏变量
free
,并且可能不是如果您想从代码< >瓦特<代码> > < FruteLe>代码>考虑在瓦特<代码> > < <代码>私下<代码>,而不是在<代码> FruteLe<代码>中声明它。也许更好的是<代码> FruteLe<代码>访问<代码>私有< /代码> COD> COD。e> free
通过
getFree
setFree
与其他人一样。我从FreeTile中删除了free变量,因此它仅在Tile类中,我还将其更改为protected。虽然我可以看出这是多么有益,但调用getFree()时仍然会出现“未定义引用”错误在FruteLLE的构造函数中,我有方法设置,但我也得到了同样的错误。我也为它自己的代码不好道歉,我仍然处于理解C++的早期阶段,因为我习惯于更简单的JavaYou,也不得不解决@ SnftelySurvivin列出的关注点。不同的课程。我把瓷砖放在前面,我的问题已经解决了,非常感谢:)给我一个更深刻的解释,如果我不这样做,我就不是一个好的学习者
#include "Tile.h"
#include <iostream>
using namespace std;

bool free;


Tile::Tile()
{
    cout<<"Constructor Called"<<endl;
}

Tile::~Tile()
{
    //dtor
}

bool getFree(){
    return free;
}

void setFree(bool bo){
    free = bo;
}