为啥当从派生类访问基类的数据时它会返回废话(我认为是指针数据)

Posted

技术标签:

【中文标题】为啥当从派生类访问基类的数据时它会返回废话(我认为是指针数据)【英文标题】:why when accessing data from the base class from a derived class does it return nonsense (pointer data i think)为什么当从派生类访问基类的数据时它会返回废话(我认为是指针数据) 【发布时间】:2015-11-07 15:42:22 【问题描述】:

我正在使用坐标为基于文本的游戏制作碰撞检测系统。我正在尝试检索我的玩家和一系列怪物的 x 和 y 位置。坐标保存在低音类字符中。当我尝试检索它返回 Xpos -858993460 的数据时,我假设它来自我正在使用的指针。

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MON_SIZE = 10;
monster* monArr[MON_SIZE];
player player1;
bool collision();

int main()

void initialise();
player1.moveChar(3, 6);
bool temp;
temp = collision();

if (temp = true)
    cout << endl << "collision detected" << endl;


        system("pause");
        return 0;



void initialise()

    srand(time(NULL));
    for (int i = 0; i < 10; i++)
    

        int inx = rand() % 9;
        int iny = rand() % 9;

        monArr[i] = new monster();
        monArr[i]->moveChar(inx, iny);
    


bool collision()

    bool collision;

    for (int i = 0; i < 10; i++)
    
        int mx, my, px, py;
        monArr[i]->getPos(mx, my);
        player1.getPos(px, py);

        if (mx == px && my == py)
        
            collision = true;
            cout << endl << mx << " " << my << endl;
        else collision = false;
    
    return collision;



#pragma once
#include "character.h"
class player :
    public character

private:

public:
    player();
    ~player();
;


#pragma once
#include "character.h"
class monster :
    public character

public:
    monster();
    ~monster();
private:

;


#include "character.h"
#include <iostream>

using namespace std;

character::character()

    xpos = 0;
    ypos = 0;



character::~character()




void character::moveChar(int Xpos, int Ypos)

    xpos = Xpos;
    ypos = Ypos;


void character::printPos()
    cout << "Position: " << xpos << " . " << ypos << endl;


void character::getPos(int& Xpos, int& Ypos)
    Xpos= xpos;
    Ypos= ypos;



#pragma once
class character

public:
    character();
    ~character();
    void moveChar(int Xpos, int Ypos);
    void printPos();
    void getPos(int& Xpos, int& Ypos);
protected:
    int xpos;
    int ypos;
;

【问题讨论】:

第一个可能的错误:void initialize(); 声明了一个名为 initialize 的函数。如果你想调用一个名为initialize的函数,你需要说initialize(); 第二个可能的错误:if (temp = true)。你可能想说if (temp == true)。顺便说一句,这是多余的和令人困惑的。说if (temp) 附带说明,您的吸气剂并不那么直观。我建议您创建一个 struct Point int x, int y, Point(int xc, int yc) : x(xc), y(yc) 并在调用 getter 时返回 Point。你总是可以使用引用/指针。 【参考方案1】:
int main()
    void initialise();
    ...

上面没有调用函数初始化。尽管您没有发布该函数,但我想它会初始化您的数组和变量...改为:

int main()
    initialise();
    ...

并将initialize()的定义移到main之前,或者至少声明它的原型。

【讨论】:

@anon 请重新阅读编辑。将 initialize() 的定义移到 main 之前,或者至少放置其原型的声明。 在调用它之前在 main 函数之上初始化它。它现在可以工作了,谢谢【参考方案2】:

把你的 charactoer::getPos 函数改成这样:

void character::getPos(int& Xpos, int& Ypos)
    Xpos = xpos;
    Ypos = ypos;

语句 Xpos *= xpos 等价于 Xpos = Xpos * xpos。这不是您想要的,尤其是因为您的 Xpos 参数未初始化。

【讨论】:

第 5 周 prograqmming.exe 0x00CB5A89 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。第 5 周 prograqmming.exe 中 0x00CB5A89 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。线程 0x2cc0 已退出,代码为 -1073741510 (0xc000013a)。线程 0x2528 已退出,代码为 -1073741510 (0xc000013a)。线程 0x2964 已退出,代码为 -1073741510 (0xc000013a)。线程 0x2c54 已退出,代码为 -1073741510 (0xc000013a)。程序“[7232] 第 5 周 programraqmming.exe”已退出,代码为 -1073741510 (0xc000013a)。 您将不得不通过调试器。否则发布一个完整的例子。您发布的代码不完整。

以上是关于为啥当从派生类访问基类的数据时它会返回废话(我认为是指针数据)的主要内容,如果未能解决你的问题,请参考以下文章

C#中继承类为啥可以通过属性访问基类的私有字段。

关于C++基类与派生类

为啥不能在派生类的构造函数初始化列表中初始化基类的数据成员?

C++ 为啥我可以从派生类调用基类的私有虚函数?

为啥我不能同时实例化对基类的引用作为派生类的指针?

为啥指向基类的派生类指针可以调用派生类成员函数? [复制]