涉及继承和私有对象的特定问题,C ++

时间:2019-03-03 20:41:32

标签: c++ oop inheritance

我将尝试使我的问题尽可能简洁:

我有3个班级,一个机器人班,一个Point类和一个世界班。

class Point
{
private:
    int x;
    int y;

public:
    void set(int x, int y)
    {
        this->x = x;
        this->y = y;
    }

    int getX()
    {
        return x;
    }

    int getY()
    {
        return y;
    }
};

class Robot{
private:
    Point roboLocale;
public:
    Robot()
    {

    }

    void init()
    {
        roboLocale.set(0, 0);
    }

class World
{
private:
    char arr[10][10];
public:
    World()
    {
        std::fill(arr[0], arr[0] + 10 * 10, ' ');

    }
    void injectRobot()
    {
        arr[roboLocale.getX()][roboLocale.getY()] = '@'; // would like to access robotLocales x and y coords
    }

    void displayField()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                std::cout << "[" << arr[i][j] << "]";
            }
            std::cout << std::endl;
        }
    }
};


int main()
{
    World field;
    Robot robot;
    robot.init();

    field.injectRobot();

    field.displayField();
}

void injectRobot()下的World类中,我试图访问robotLocale的getX()和getY()成员函数,以将机器人“注入”到我的World::arr中。我根本不知道该怎么做,或者甚至可能。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的injectRobot不知道任何Robot实例。它应该如何知道程序的其他位置(在您的main中)有一个实例,该实例可用于获取{strong> private 的roboLocale对象Robot类?

  1. 您的injectRobot必须具有一个函数参数,您要在其中传递要注入的Robot实例(如果您唯一感兴趣的是,至少传递其位置)。
  2. 您的injectRobot必须能够实际获取存储在该Robot对象中的位置信息。

您可以尝试:

#include <array>
#include <iostream>

class Point
{
private:
    int _x{};
    int _y{};

public:

    // Default constructor to prevent uninitialized values
    Point() = default;

    Point(int x, int y) 
        : _x(x), _y(y) { }

    void set(int x, int y)
    {
        _x = x;
        _y = y;
    }

    int x() const { return _x; }
    int y() const { return _y; }
};

class Robot 
{
private:
    Point _robolocale;
public:
    Robot() = default;
    Robot(int x, int y) : _robolocale(x, y) {}
    Point const& pos() const { return _robolocale; }
};

class World
{
private:
    char arr[10][10];
public:
    World()
    {
        std::fill(arr[0], arr[0] + 10 * 10, ' ');
    }
    // Which robot should be injected? 
    // We need to pass a robot in because otherwise there is none to inject
    void injectRobot(Robot const& r)
    {
        arr[r.pos().x()][r.pos().y()] = '@'; // would like to access robotLocales x and y coords
    }

    void displayField()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                std::cout << "[" << arr[i][j] << "]";
            }
            std::cout << std::endl;
        }
    }
};


int main()
{
    World field;
    Robot robot1;
    Robot robot2(7, 4);

    field.injectRobot(robot1);
    field.injectRobot(robot2);

    field.displayField();
}