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

Я очень новичок в этом (объектное программирование), и я пытаюсь получить доступ и затем изменить защищенный массив из унаследованного класса.Но когда я изменяю его в производном классе, он не меняется в базовом классе, и это то, что я хочу сделать.

Есть ли способ соединить эти два, например, когда вы передаете аргумент функции по ссылке?

#include <iostream>
using namespace std;
class a {
protected:
    int i=0;

public:
    void print(){
        cout<<i<<endl;
    }

}a;

class b : protected a {
public:
    void print(){
        i++;
        cout<<i<<endl;
    }

}b;

int main(){
    a.print(); //0
    b.print(); //1
    a.print(); //0  - I want this to be 1
return 0;
}

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Ваш код эффективно выполняет

Ford myFord;                     // a a;
BlueFord yourFord;               // b b;

myFord.printMileage();           // a.print();
yourFord.driveAndPrintMileage(); // b.print(); <- does more than printing!
myFord.printMileage();           // a.print();

Нет никаких причин, по которым пробег myFord должен меняться при движении yourFord.Это один и тот же тип автомобиля (а Ford, последний - специальное синее издание), но они не тот же автомобиль (один ваш, другой мой).Вождение одного не меняет пробег другого.

Вы используете одно и то же имя для типа (Ford) и экземпляра (myFord) каждого класса / переменной,Это принципиально разные вещи, и присвоение им одного и того же имени не делает их одним и тем же (это только делает вещи более запутанными для вас).

Если i переменная static будет синхронизирована«это между всеми экземплярами - как будто каждый Ford автомобиль всегда был подключен к Интернету и транслировал изменения на i на все остальные Ford s.Представьте себе static int i как счетчик "общее количество миль, пройденных всеми (синими) бродами".Но обратите внимание, что переменная static больше не живет в одном из экземпляров (она хранится не в каждом Ford), а где-то централизованно (на каком-то сервере компании Ford).

Но вся идея объектно-ориентированного программированияизбавляется от глобального состояния (которое включает в себя static переменных) и каждый экземпляр управляет своим собственным состоянием.Я не хочу, чтобы мои Ford постоянно общались со всеми другими Ford, полагаясь на какое-то внешнее соединение.

0 голосов
/ 21 июня 2019

a и b являются несвязанными объектами, каждый из которых имеет собственную копию переменной-члена i.a.i и b.i - это разные переменные, поэтому изменение одной не влияет на другую.

Кроме того, имена ваших классов выбраны неправильно.У вас есть класс a и объект a.Это просто сбивает с толку.Вместо этого используйте заглавные буквы в именах классов.Назовите их A и B.

Похоже, что здесь вы хотите вызвать две разные print() функции для одного и того же объекта .Вы можете сделать:

B b_obj;           // Create an object of type B
b_obj.A::print();  // Calls A::print() on b_obj
b_obj.print();     // Calls B::print() on b_obj
b_obj.A::print();  // Calls A::print() on b_obj

Обратите внимание, что есть проблема с функцией print().И у A, и у B есть такой, и это приведет к неожиданному поведению при работе с полиморфизмом.Тем не менее, я предполагаю, что вы еще не достигли этой части.Пока просто помните, что иметь функцию-член в производном классе, имя которого совпадает с именем функции в базовом классе, может быть очень проблематично, если только базовая функция не помечена как virtual.Но я полагаю, что вы скоро придете к этой части книги (или к тому, что используете для изучения C ++).

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