c++ - 对象数组的 C++ 类
问题描述
我正在学习 C++,为此,我尝试做一个简单的游戏项目(具有与列相同的行和从 0-空白到行*行-1 的随机分布的数字。目标是让玩家将数字更改为数字顺序按行)。然后 0-blank 可以与任何邻域水平或垂直切换)我通过程序代码对其进行编码,它工作正常。现在我正在尝试使用面向对象的编程和类来重做它。
出于这个原因,我有 2 个类: Number - 存储 2 个位置为 x 和 y 的整数 Deck - 存储数字数组,实际上数组的索引是数字本身,而 Number 对象只存储位置。
甲板甲板(行)创建带有位置的排序数字,并由 std::cout 检查。现在我正在尝试实现 shuffle 函数,该函数将随机取 2 个数字并切换它们的位置(m_posX 和 m_posY),但是尝试使用相同的原理来获取 m_posX 是不正确的,并且与位置的创建相比,它给出了不同的大数字。getNumber 只是不能按我的预期工作。实际上,我需要从 m_game 甲板数组中的确切 Number 对象返回 m_posX 和 m_posY。
欢迎任何建议我做错了什么。
我有这个代码:
编号.h
#ifndef NUMBER_H
#define NUMBER_H
#include <array>
class Number
{
public:
// Number(int x, int y, int d);
setPosition (int x, int y);
setPosition (std::array <int,2> &xy ); // std::array [2]
setDigits (int d);
switchPosition (Number &c1, Number &c2);
std::array<int,2> getPosition (); // std::array [2]
int getPositionX ();
int getPositionY ();
int getDigits(); // int
protected:
int m_posX;
int m_posY;
int m_digits;
};
#endif // NUMBER_H
数字.cpp
Number::setPosition (int x, int y)
{
m_posX = x;
m_posY = y;
}
Number::setPosition (std::array <int,2> &xy )
{
m_posX = xy [0];
m_posY = xy [1];
}
Number::setDigits (int d)
{
m_digits=d;
}
Number::switchPosition (Number &c1, Number &c2)
{
int tempX {c1.m_posX};
int tempY {c1.m_posY};
c1.setPosition (c2.m_posX, c2.m_posY);
c2.setPosition (tempX, tempY);
}
std::array<int,2> Number::getPosition ()
{
static std::array <int,2> position;
position [0] = m_posX;
position [1] = m_posY;
return position;
}
int Number::getDigits ()
{
return m_digits;
}
int Number::getPositionX ()
{
return m_posX;
}
int Number::getPositionY ()
{
return m_posY;
}
甲板.h
#ifndef DECK_H
#define DECK_H
#include "number.h"
class Deck
{
public:
Deck(int rows=3);
shuffleDeck (int rows);
Number & getNumber (int elementNumber);
protected:
std::array <Number,100> m_game;
};
#endif // DECK_H
甲板.cpp
#include "deck.h"
#include "number.h"
#include "rnd.h"
#include <iostream>
Deck::Deck(int rows)
{
std::array <Number,100> m_game;
for (int j {0}; j < (rows); ++j)
{
for (int i {0}; i < (rows); ++i)
{
m_game[i+j*rows].setPosition (i,j);
std::cout << "Number: " << (i+j*rows) << '\t' << "Coordinates: " << '\t' << m_game[i+j*rows].getPosition()[0] <<"," << m_game[i+j*rows].getPosition()[1] << '\n' ;
};
};
std::cout << "fc Deck::Deck (int rows) Number10 posX: "<< m_game[10].getPosition()[0] << '\n';
std::cout << "fc Deck::Deck (int rows) Number10 posY: "<< m_game[10].getPosition()[1] << '\n';
}
Number & Deck::getNumber (int elementNumber)
{
std::cout << "fc Deck::getNumber() Number " << elementNumber << " getPosition X,Y: " << m_game[elementNumber].getPositionX() << "," << m_game[elementNumber].getPositionY() << '\n' ;
return m_game[elementNumber];
}
game.cpp 运行代码
#include "game.h"
#include "gmath.h"
#include "constant.h"
#include "graphics.h"
#include "number.h"
#include "deck.h"
#include <iostream>
int game (int rows)
{
int steps = 0;
Graphics piece {};
Deck deck(rows);
Number temp = deck.getNumber(10);
int tempI = temp.getPosition()[10];
//
// THIS DOES NOT WORK GETTING printed large number as 28573728
// [10] has m_posX set to 2 and m_posY set to 2 by Deck deck (rows);
//
std::cout << "CHECK game.h Number10 positionX: "<< tempI << '\n';
return steps; // for future counting score
}
解决方案
尝试按值返回,而不是按引用返回:
Number & Deck::getNumber (int elementNumber)
{
std::cout << "fc Deck::getNumber() Number " << elementNumber << " getPosition X,Y: " << m_game[elementNumber].getPositionX() << "," << m_game[elementNumber].getPositionY() << '\n' ;
return m_game[elementNumber];
}
像这样:
Number Deck::getNumber (int elementNumber)
{
std::cout << "fc Deck::getNumber() Number " << elementNumber << " getPosition X,Y: " << m_game[elementNumber].getPositionX() << "," << m_game[elementNumber].getPositionY() << '\n' ;
return m_game[elementNumber];
}
当然不要忘记更改声明:
Number getNumber (int elementNumber);
推荐阅读
- java - 由于 EXCEPTION_ACCESS_VIOLATION (0xc0000005) 导致的线程 ConcurrentGCThread 导致 JVM 崩溃
- android - 在 Azure DevOps 中共享版本信息
- python - 给定一棵树 T = (V, E),找到从顶点 v 到顶点 w 的直接路径
- twig - (Twig)如何检查从翻译键获取的值(作为字符串或数组?)是否存在于产品变体标题中
- javascript - 用于删除过期日期的 JavaScript 算法?
- javascript - ReferenceError:图像未定义
- javascript - 如何遍历我的数组,以便在我的按钮元素中写出数组中的每个值?
- javascript - Postgresql 在 node.js 中不起作用。“要求('pg')”返回错误
- r - 是否有任何选项可以进行列拆分?
- java - 在 java 11 上的 SSL 通信期间发生 SocketException 时,如何使用 DefaultHttpRequestRetryHandler(HTTPClient) 重试?