访问数组重新创build对象中的对象?

我正在做一个游戏机,我在制作地图。 该地图是一组向量。 向量包含我打印到控制台的字符。 我的代码:

“在window.h”

#include <string> #include <vector> class Row { public: std::vector<char> row; int id; Row(); void printRow(); void resetRow(); void insertStringIntoRow(std::string toInsert, int startIndex); std::vector<char> getRow() { return row; } }; class Window { public: void showMap(); void writeToMap(std::string stringToInsert, int rowNum, int startIndex); void writeInRectangle(std::string stringToWrite, int rowNum, int startIndex); void setCursorToPosition(int x, int y); void resetMap(); Row getRowAt(int index); }; void initColors(); void setWindow(Window windowToSet); Window getGameWindow(); 

“Window.cpp”

 #include "Window.h" #include <iostream> #include <Windows.h> #include <WinBase.h> #include <stdlib.h> #include "color.h" using namespace eku; Row map[25]; //Class Window void Window::showMap() { setCursorToPosition(0, 0); for (int i = 0; i < 25; i++) { getRowAt(i).printRow(); } } void Window::writeToMap(std::string stringToInsert, int rowNum, int startIndex) { Row r = getRowAt(rowNum); r.insertStringIntoRow(stringToInsert, startIndex); } void Window::writeInRectangle(std::string stringToWrite, int rowNum, int startIndex) { if (startIndex != 0) { std::string topbar = "~"; for (int i = 0; i < stringToWrite.length() + 2; i++) { topbar += ' '; } topbar += '^'; getRowAt(rowNum - 1).insertStringIntoRow(topbar, startIndex - 1); } std::string toInsert = "~ ^" + stringToWrite + "~ ^"; getRowAt(rowNum).insertStringIntoRow(toInsert, startIndex - 1); if (startIndex != 25) { std::string bottombar = "~"; for (int i = 0; i < stringToWrite.length() + 2; i++) { bottombar += ' '; } bottombar += '^'; getRowAt(rowNum + 1).insertStringIntoRow(bottombar, startIndex - 1); } } void Window::setCursorToPosition(int x, int y) { HANDLE hOut; COORD Position; hOut = GetStdHandle(STD_OUTPUT_HANDLE); Position.X = x; Position.Y = y; SetConsoleCursorPosition(hOut, Position); } void Window::resetMap() { for (Row row : map) { row.resetRow(); } } Row Window::getRowAt(int index) { return map[index]; } //Class Row const char WHITEBACKCOL = '~'; const char DEFCOL = '^'; int i = 0; Row::Row() { row.resize(80, ' '); id = i; i++; } void Row::printRow() { for (int i = 0; i < row.size(); i++) { switch (row[i]) { case WHITEBACKCOL: setcolor(black, white); case DEFCOL: setcolor(white, black); default: std::cout << row[i]; } } } void Row::resetRow() { row.resize(80); for (int i = 0; i < 80; i++) { row[i] = ' '; } } void Row::insertStringIntoRow(std::string toInsert, int startIndex) { int endIndex = (startIndex + toInsert.length()); int stringPos = 0; for (int i = startIndex; i < endIndex; i++) { if (i < row.size() - 1) { row.at(i) = toInsert[stringPos]; } else { row.push_back(toInsert[stringPos]); } stringPos++; } } Window defWindow; void initColors() { concolinit(); setcolor(white, black); } void setWindow(Window windowToSet) { defWindow = windowToSet; } Window getGameWindow() { return defWindow; } 

“Main.cpp的”

 #include <iostream> #include "GameEngine.h" #include "Window.h" int main() { setWindow(Window()); initColors(); getGameWindow().writeInRectangle("Hia", 1, 10); getGameWindow().showMap(); } 

每当我打电话给showMap()我所得到的是一个空白的控制台。 它似乎只是打印空间的默认地图,而不是我input的文本。 我也尝试使用printRow()打印我编辑的单行,但他们也只显示空格。 我可以在insertStringIntoRow()方法中查看对vector行的更改,但即使这些更改应该在那里,也不会显示在其他任何地方。 几乎看起来像我的Row对象正在创build每次我访问它。 我是新来的C ++,所以任何帮助表示赞赏。 提前致谢!

此功能使用不正确。 警告标志是它是非常量,但用作访问者。 它将返回矢量的副本,而不是引用。

 std::vector<char> getRow() { return row; } 

你调用它的方式,你期望它在原地修改行,但是你实际上正在修改的行的副本,然后立即丢弃。 例:

 getRowAt(rowNum).insertStringIntoRow(toInsert, startIndex - 1); 

这个行为的简单解决方法是从getRow()返回一个引用:

 std::vector<char> & getRow() { return row; } 

另一个要解决的问题是将其分配给临时变量而不是内联使用。 在这种情况下,你可以把这个暂时的参考作为参考:

 Row & r = getRowAt(rowNum); r.insertStringIntoRow(stringToInsert, startIndex); 

实现这个的正确方法是提供一个const版本,这样它仍然可以在调用者不想修改它的const对象上调用。

 const std::vector<char> & getRow() const { return row; } 

我只是把这个额外的东西放在这里,因为这是好的做法,但是你不应该在这个程序中做。 这会混乱你的代码已经充满了更糟糕的做法=)

发送一个引用writeToMap()而不是变量。 这将更改原始地图对象而不是复制变量。