Доступ к свойствам класса C++

Вопрос в следующем: необходимо реализовать функционал списка, но суть задачи в следующем: есть 2 списка, в одном набор символов, а в другом - текст, из которого эти символы нужно убрать. Оба списка, само собой, одного и того же класса, а свойства - под модификатором Protected. Через дочерний класс задачу решить не получается, поэтому думаю над тем, как можно её решить..

#include <iostream>

//задание: используя принципы ООП, реализовать тип данных "список".
//Используя созданный тип данных, удалить символы из текста.


struct Node{
//структура для хранения элемента списка

    char value{' '};
    //значение 
    
    Node *next{nullptr};
    //указатель на след.элемент
};


class List{
//класс для создания списка 

    protected:
    
    Node *p;
    //список (по умолчанию пустой с нулевой длиной)
    
    public:
    
    List(){
    //конструктор
    
        char *buf;                                  
        //буффер
        
        buf = new char[1000];
        std::cin >> buf;                            
        //заполнение буффера
        
        std::cin.clear();
        int counter{0};
        //счётчик длины списка для текста
        
        while (buf[counter] != NULL){               
            counter++;     
        }
        p = new Node[counter];
        for (int i{0}; i < counter-1; i++){
            p[i].next = &p[i+1];
            //привязываем элементы между собой
        }
        for (int i{0}; p[i].next != nullptr; i++){
            p[i].value = buf[i];
            //заполнение элементами буфера
        }
        
    }
    
    void print(){
    //вывод списка
    
        for (int i{0}; p[i].next != nullptr; i++){   
            std::cout << p[i].value;
        }
        std::cout << std::endl;
    }
    
    
    void replace(int index, char val){
    //замена символов
    
        if (val == '~'){
            p[index].value = NULL;
        }else{
            p[index].value = val;
        }
    }

};

class Oper: protected List{
public:

    void sravn(List a, List b){
        int i{}, j{};
        while (a.p[i].next != nullptr){
            while (b.p[j].next != nullptr){
                if (a.p[i].value == b.p[j].value){
                    a.replace(i, '~');
                    break;
                }
            }
        }
    }
    
};


int main(){
    List text;
    //создаём список для текста
    
    std::cout << "Before: " << std::endl;
    text.print();
    //выводим его
    
    List set;
    //список для символов, которые надо удалить
    
    Oper d;
    //объект для сравнения (дочерний класс)
    
    d.sravn(text, set);
    //метод сравнения
    
    std::cout << "After: " << std::endl;
    text.print();
    
    std::cout << std::endl;
    return 0;
}

Ответы (1 шт):

Автор решения: ampawd

Этот метод принимает параметры по значению, что означает изменение локальных копий объектов a,b а не тех которые определены в main

void sravn(List a, List b){...}

Вам нужно по ссылке передавать (либо по указателю)

void sravn(List& a, List& b){...}
→ Ссылка