Как изменить переменную базового класса из 2 дочерних классов - PullRequest
0 голосов
/ 15 января 2019

Это упрощенная версия моей проблемы, я хочу изменить переменную (2d вектор в моем исходном коде) в базовом классе, используя функцию из 2 дочерних классов, сохраняя измененную переменную и отображая ее.

По сути, я хочу изменить переменную, объявленную в базовом классе, вызывая функции с одинаковыми именами из разных дочерних классов, и измененная переменная будет доступна всем дочерним классам. Извините за плохое понимание полиморфизма, все еще пытаюсь переварить.

PS: я удалил конструктор и виртуальный деструктор снизу, потому что stackoverflow не пропустит меня в противном случае.

#include <iostream>

using namespace std;

class Shape
{
    protected:
    int test[3];

    public:
    virtual void chgValue() {}
    void setInitialValue();
    void showValue();
};

void Shape::setInitialValue() //sets test to {1,2,3}
{
    test[0]=1;
    test[1]=2;
    test[2]=3;
}

void Shape::showValue() //display elements of test
{
    for(int i=0;i<3;i++)
        cout<<test[i]<<" ";
}

class Square : public Shape //child class 1
{
    public:
    void chgValue()
    {
        test[1]=5;
    }
};

class Triangle : public Shape //child class 2
{
    public:
    void chgValue()
    {
        test[2]=7;
    }
};

int main()
{
    Shape a;
    Square b;
    Triangle c;

    Shape *Shape1=&b;
    Shape *Shape2=&c;

    a.setInitialValue(); //sets test to {1,2,3}
    Shape1->chgValue(); //change test[1] to 5
    Shape2->chgValue(); //change test[2] to 7
    a.showValue();  //shows 1 2 3 instead of 1 5 7

    return 0;
}

Ожидаемый выход составляет 1 5 7, но фактический выход составляет 1 2 3.

1 Ответ

0 голосов
/ 15 января 2019

Полагаю, у вас неправильно понято понятие ООП:

Shape a;
Square b;
Triangle c;

Это означает, что вы определили три разных объекта, и они занимают три отдельные области памяти в ОЗУ.

a.setInitialValue();

Это просто устанавливает элементы int test[3]; объекта a.

Shape *Shape1=&b;
Shape *Shape2=&c;

Shape1->chgValue();
Shape2->chgValue();

Это должно изменить элементы int test[3]; объектов b и c соответственно; и это НЕ влияет на объект a.

Ведь элементы int test[3]; из:

  • the a: 1 2 3
  • b: х 5 х
  • c: х х 7

Примечание: x здесь означает undefined (в ОЗУ может быть какой-то мусор).


Обновлено с учетом комментариев OP

Если вы действительно хотите «изменить переменную, объявленную в базовом классе, вызывая функции с одинаковыми именами из разных дочерних классов, и измененная переменная будет доступна всем дочерним классам», тогда вы могли бы объявить int test[3]; в Shape статические следующим образом:

class Shape
{
  protected:
    static int test[3];

  public:
    // other code goes here
    // ...
};

int Shape::test[3];

// other code goes here
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...