首页 > 解决方案 > 对象数组的 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
    }

标签: c++arraysclassoopc++17

解决方案


尝试按值返回,而不是按引用返回:

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);

推荐阅读