Проблема в доступе к переменным-членам - PullRequest
0 голосов
/ 30 мая 2018
#include<iostream>

class A {
    int a, b;
public:
    void setdata(int x, int y) { a = x; b = y; }
    void showdata() { std::cout << a << b; }
};

class B : public A { };

int main() {
    A  a1;
    B  b1;
    a1.setdata(5, 4);
    a1.showdata();
    b1.showdata();
}

Я просто хочу напечатать значения членов a и b, используя объект b1 класса B, поскольку он может получить доступ к функциям-членам класса A, так как класс B имеет публичное наследование класса A.Но я получаю значения мусора, когда пытаюсь напечатать значения a и b, используя b1.

Может кто-нибудь объяснить, почему это происходит и как это исправить?

1 Ответ

0 голосов
/ 30 мая 2018

a1 и b1 являются полностью отдельными экземплярами объектов в памяти.У них есть собственные копии членов a и b в памяти.Они не имеют ничего общего друг с другом.Что бы вы ни делали для a1, это никак не повлияет на b1, и наоборот.

Вы инициализируете только элементы a1, вы вообще не инициализируете элементы b1.Вот почему вы видите мусор, когда пытаетесь распечатать элементы b1.

Перед вызовом b1.showdata(), вам необходимо вызвать b1.setdata() для инициализации b1 членов, например:

int main() {
    A  a1;
    B  b1;
    a1.setdata(5, 4);
    a1.showdata();
    b1.setdata(1, 2); // <-- add this!
    b1.showdata();
}

Вы также должны предоставить class A конструктор по умолчанию, который инициализирует элементы значениями по умолчанию, в случае, если setdata() не вызывается после построения (например, что произошло в вашем случае), например:

class A {
    int a, b;
public:
    A() : a(0), b(0) {} // <-- add this!
    void setdata(int x, int y) { a = x; b = y; }
    void showdata() { std::cout << a << b; }
};

В качестве альтернативы, вы можете рассмотреть возможность предоставления class A и class B конструктора, который принимает значения в качестве входных данных, например:

class A {
    int a, b;
public:
    A() : a(0), b(0) {}
    A(int x, int y) : a(x), b(y) {} // <-- add this!
    void setdata(int x, int y) { a = x; b = y; }
    void showdata() { std::cout << a << b; }
};

class B : public A {
public:
    B() : A() {}
    B(int x, int y) : A(x, y) {}
};

/* or simpler:

class B : public A {
public:
    using A::A; // <-- inherit all constructors
};
*/

int main() {
    A  a1(5, 4);
    B  b1(1, 2);
    a1.showdata();
    b1.showdata();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...