Доступ к свойствам класса 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){...}