【问题标题】:How can I convert from a class with a 2D vector of chars to a 2D vector of another obj with a char variable?如何从具有 2D 字符向量的类转换为具有 char 变量的另一个 obj 的 2D 向量?
【发布时间】:2013-03-31 02:43:13
【问题描述】:

我还是新手,所以如果我为我的问题提供的信息过多或不足,我提前道歉。


失败

这个问题不是与流氓游戏相关的问题,但对于我的程序所做的一点背景.. 是类似于流氓游戏。

好的,所以我有一个类,它有一个成员 2D 字符向量(这些字符被操纵以表示一个“地牢”)。一切都无缝地工作。我想扩展我的程序可以做的事情,所以我决定创建一个新类来替换 chars 的 2D 向量,以便 char 只是新类的视觉表示,其他变量可以与该 char 一起存储。

为了简单起见,我尝试删除此问题不需要的内容。这个新类称为Tile - 代表用于地牢关卡的空间。 平铺有:

  • 一个名为 displayChar.. 的 char 变量默认为 ' ' 更改以表示它包含的内容

  • (其他变量..)


问题/我可怜的猜测

我不是最擅长完全理解一些编程语法/实现的概念,所以请不要评判。

  • 我填充字符向量的方式,我将其调整为游戏板的宽度,并将所有内容设置为“”,因为所有值都是字符
  • 我想我需要用新的 Tile 对象填充它并将它们推送到 二维平铺矢量?

  • 我处理 char 值的其他方法出现错误。

  • 我想我应该更改方法以获取指向 Tile 的指针 对象并使用 setDisplayChar(' ') 方法更改其 价值?

  • 我的 at(int, int) 方法用于返回该位置的字符

  • 我以为我可以将其更改为“return m_vvTiles[y][x].getDisplayChar()”,但出现错误

我不擅长改变某些东西的工作方式,而且我通常最终会把我的代码弄得一团糟。我将发布与此相关的代码。我非常感谢您提供的任何帮助。如果我需要添加更多内容,请告诉我。 (我会尽量将代码最小化为仅相关的方法)。谢谢!


DungeonLevel.h

#include "Tile.h"
#include <vector>
#include <random>

class DungeonLevel {
public:
    DungeonLevel(int iWidth, int iHeight, std::mt19937 & mt);
    ~DungeonLevel(void);

    void dump();
    char at(int x, int y);

    int getWidth();
    int getHeight();

private:
    std::vector<std::vector<Tile>> m_vvTiles; //Tile was char

};

DungeonLevel.cpp

#include <iostream>
#include <random>
#include "DungeonLevel.h"

using namespace std;


DungeonLevel::DungeonLevel(int iWidth, int iHeight, std::mt19937 & mt){
    // Initialize the blank vector
    m_vvTiles.resize(iHeight);

    for(auto it = m_vvTiles.begin(); it != m_vvTiles.end(); it++ ){
    //      Tile tempTile = new;?
            (*it).resize(iWidth,' ');
    }

    // divide the level into 4x2 chunks
    int iChunkWidth = iWidth / 4;
    int iChunkHeight = iHeight / 2;

    // Taking the easy way out, and generating
    // a loop of tunnels first to drop rooms on to
    for( int x = (iChunkWidth/2); x <= ((3 * iChunkWidth) + (iChunkWidth/2)$
            m_vvTiles[iChunkHeight/2][x] = '#';
            m_vvTiles[iChunkHeight + (iChunkHeight/2)][x] = '#';
    }

    for( int y = (iChunkHeight/2); y <= (iChunkHeight + (iChunkHeight/2)); $
            m_vvTiles[y][iChunkWidth/2] = '#';
            m_vvTiles[y][(3 * iChunkWidth) + (iChunkWidth/2)] = '#';
    }

 void DungeonLevel::dump(){
    for( auto itOuter = m_vvTiles.begin(); itOuter != m_vvTiles.end(); itOu$
            for( auto itInner = (*itOuter).begin(); itInner != (*itOuter).e$
                    cout << *itInner.getDisplayChar(); ///Updated:: CAUSING ERROR//
            }

            cout << endl;
    }
}



//SEVERAL IRRELEVANT LINES FOR THIS PROBLEM..

}

char DungeonLevel::at(int x, int y){
    return m_vvTiles[y][x].getDisplayChar();
    //return m_vvTiles[y][x]; WORKED BEFORE
}

Tile.h

#include "Entity.h"
#include <vector>

class Tile : public Entity {
public:
    Tile(void);
    virtual ~Tile(void);
    //void setEntity(Entity * entityToSet); BOTH IRRELEVANT
    //Entity * getEntity();
    void setDisplayChar(char displayCharToSet);
    char getDisplayChar();
    //virtual void dumpObjectData(); IRRELEVANT AT THIS TIME


private:
    char displayChar;
    //Entity * theEntity; IRRELEVANT AT THIS TIME
};

Tile.cpp

#include "Tile.h"
#include "Entity.h"

using namespace std;

Tile::Tile(void){
    displayChar = '.';
    //theEntity = NULL;
}


Tile::~Tile(void){

}

void Tile::setDisplayChar(char displayCharToSet){
    displayChar = displayCharToSet;
}

char Tile::getDisplayChar(){
    return displayChar;
}

*这是我现有的错误:*

对于DungeonLevel.cpp中的dump()方法,

【问题讨论】:

  • 您目前遇到的错误是什么?
  • 关于无法从 char 转换为 Tile 类型以及一堆说明符错误的大量行。它给出了大约 100 行错误

标签: c++ class object implementation 2d-vector


【解决方案1】:

你的一些问题与我的回答

我想我需要用新的 Tile 对象填充它并将它们推送到 2D Tile 矢量?

不,您需要调整它的大小并用 Tile 对象填充它。就像你在它是一个 char 数组时所做的一样。没有新的。

我认为我应该更改方法以获取指向 Tile 对象的指针并使用 setDisplayChar(' ') 方法来更改其值?

我会使用参考。

我以为我可以将其更改为 return m_vvTiles[y][x].getDisplayChar(),但出现错误。

听起来不错,你遇到了什么错误?

您重新设计的所有内容对我来说都很有动力。不过,在进行重大重组之前进行备份是个好主意。

【讨论】:

  • 谢谢,这绝对有帮助。我也收到关于没有调整 Tile 大小的错误?说我在需要 1 时传递 2 个参数。 (我假设那是在构造函数的第一个 for 循环中)返回 getDisplayChar 的错误可能是由某处的另一个问题引起的
  • 嗯,我刚刚注意到 Tile 派生自 Entity。如果您打算使用多态性,那么您应该使用指针向量而不是对象向量。但是将其搁置一分钟 (*it).resize(iWidth,' ') 是一个错误,因为第二个参数的类型应该是 Tile 而不是 char。我建议这个(*it).resize(iWidth, Tile(' ')),但这需要你为Tile编写一个构造函数,它接受一个char参数Tile::Tile(char ch) { displayChar = ch; }。无论如何,这听起来可能是个好主意。
  • 好的,谢谢,我会试试的。是的,Tile(最终将)能够保存指向 Entity obj 的指针,以及它的 displayChar 和其他值。基本上是为了让 Tile 显示它可能持有的东西(例如项目)。
  • 我这样做了,它消除了大部分错误。现在,当我尝试将字符显示到控制台时,它在方法 dump() 中给了我一个错误。我已经用代码和错误消息更新了我的问题。
  • 这只是一个运算符优先级错误cout &lt;&lt; *itInner.getDisplayChar() 应该是cout &lt;&lt; (*itInner).getDisplayChar() 或更简单的cout &lt;&lt; itInner-&gt;getDisplayChar()。您可以在迭代器上使用-&gt;,就像在指针上使用它一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多