【问题标题】:A 2D array of objects in a class SFML C++SFML C++ 类中的二维对象数组
【发布时间】:2014-06-11 17:24:54
【问题描述】:

(如果有问题,我很抱歉,这是我的第一个问题)

我正在尝试为我的游戏创建一个房间网格(类似于以撒的绑定)。

我有一个名为“Station”的指挥类,我希望在其中有一个 2D 房间数组,我在我的类“房间”中定义了它。 在我的 main.cpp 中,我使用了一个名为 currentroom 的 Room 对象,我想通过引用来传递我的 Station 类中的函数 loadRoom。该函数将生成数组中的所有房间,并通过引用将中间的房间传回 main.cpp。 我一直在努力让它与向量、数组、指针数组甚至是专门为存储房间目的而设计的新类一起工作,但似乎没有任何效果。请帮助我,这些是我之前提到的两个课程: Station.h:

#pragma once
#include "The Station.h"

class Station
{
public:
    void pause();
    void resume();
    int h,w;
    Station();
    sf::RenderWindow App;
    sf::Image guii;
    sf::Texture player, bgt,   guit, fltilt;
    sf::Font arial;


    void loadSection(Room& currentroom);
};

房间.h:

#pragma once
#include "The Station.h"

#define n 16
#define m 6
class Station;
class enemy;
class projectile;
class Room
{
public:
    tile floortile[n][m];
    sf::Texture floort,enemyt, dleftt,sht, drightt,dtopt,dbottomt, chestt;
    int chest_max=15;
    int chestcount;
    bool dleft, dright,dtop,dbottom,isempty;
    Room();
    void loadroom(int w, int h);
    std::vector <enemy> enem;
    std::vector <projectile> proj;
    void spawn_enemy(int x,int y);
};

我希望第一个拥有后者的数组。 谢谢。

编辑: 好的,这就是我得到的: 当我简单地尝试制作这样的二维数组时:

Room sect[10][10];

我把它放在 void loadSection 之前的一个类中,它在运行后一秒钟就崩溃了。 当我在同一个地方创建一个名为“lvl”的 Section 类对象时,它只会在我尝试访问 Room 的成员时崩溃,如下所示:

this->lvl->Row[5].Column[5].loadroom(this->w,this->h);

但是,当我创建一个向量向量时,如下所示:

std::vector< vector< Room > > station;

当我尝试调整它的大小时它会崩溃,无论我是使用初始化程序、push_back 还是 vector::resize。

错误总是一样,Application.exe 停止工作。

有什么想法吗?

【问题讨论】:

  • 欢迎来到 SO!为了提供帮助,我们需要有关问题出在哪里(以及适当的代码和输出)的更具体的信息。例如,是否有正确通过引用传递或找到中间的问题?
  • 问题是当我运行它时,它会停止工作,除非我从 Station 类中删除数组。没有构建错误。 (在上面的代码中,我没有包含我尝试过的任何二维数组版本,但是所有这些版本要么使程序在运行后停止工作一秒钟,要么导致运行时错误(不寻常的方式和这种东西)。
  • @user3104621 请在您的问题中添加任何重要信息。把它当作评论没什么用。
  • 这些信息够不够,因为我不知道还能说什么。
  • 最可能的原因是您尝试访问二维数组边界之外的元素。为了找到代码的错误部分,您应该给我们一个最小的示例(请参阅stackoverflow.com/help/mcve)。此外,如果您的调试器没有为您提供导致崩溃的代码行,您可能应该只逐步执行代码(一次一条指令)。

标签: c++ arrays class 2d sfml


【解决方案1】:

我解决了这个问题。我删除了 loadRoom 函数并将其代码放入默认构造函数中。我遇到的另一个问题是 sf::Texture operator= 重载导致崩溃,所以我再次从文件加载纹理而不是复制它们。我知道它很浪费而且很慢,但我会在几个月后在 Unity 中从头开始编写它,所以我不在乎它是否优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多