Объясните пожалуйста, где ошибка ? Пометил комментариями ошибку. За пример взял перегрузку операции.
#include <iostream>
#include <conio.h>
using namespace std;
class Counter
{
protected:
int count;
public:
Counter():count(0)
{}
Counter(const int t):count(t)
{}
void get_count()
{
cout << count << endl;
}
Counter operator + (Counter t2)
{
return (this->count + t2.count);
}
};
class NewCounter :public Counter // писать здесь protected Counter и все равно не помогло
{
public:
NewCounter(int c): Counter(c)
{}
Counter operator -(Counter t2)
{
return (this->count + t2.count);
//ошибка в t2.count, пишет: "не удается получить доступ к защищенному члену Counter::count"
}
};
int main()
{
Counter t1(5), t2(4), t3;
t3 = t1 + t2;
t3.get_count();
_getch();
return 0;
}
Counter operator + (Counter& t2)
Странный оператор вычитания в NewCounter реализует почему-то сложение.
Собственно ответ на вопрос. Доступа к члену count у типа Counter вне его методов нету так как член протектированный. Сделайте вот так:
Counter operator -(NewCounter& t2)
{
return (this->count + t2.count);
}
UPD1:
Подумал немного как сделать оператор сложения для NewCounter и Counter без друзей и функции доступа get а только с помощью конструкторов инициализации. И вот что получилось:
#include <iostream>
using namespace std;
class Counter{
protected:
int count;
public:
Counter():count(0){}
Counter(Counter& cnt):count(cnt.count){}
Counter(const int t):count(t){}
void get_count(){cout << count << endl;}
Counter operator + (Counter& t2){
Counter ret(this->count + t2.count);
return ret;}
};
class NewCounter :public Counter{
public:
NewCounter(int c): Counter(c){}
NewCounter(NewCounter& cnt):Counter(cnt.count){}
NewCounter(Counter& cnt): Counter(cnt){}
NewCounter operator +(NewCounter& t2) {
NewCounter ret(this->count + t2.count);
return ret;}
NewCounter operator +(Counter& t2) {
NewCounter ret1(t2);
NewCounter ret(this->count + ret1.count);
return ret;}
};
int main(){
Counter t1(5), t2(4), t3;
NewCounter t4(3);
NewCounter t5(0);
t3 = t1 + t2;
cout<<endl<<endl<<"t3=";
t3.get_count();
t5 = t4 + t2;
cout<<endl<<"t5=";
t5.get_count();
return 0;
}
Здесь немного переделано форматирование, чтобы пример занимал поменьше строк. Операторы все сделаны как операторы сложения. В операторах сложения введены явно возвращаемые значения нужных типов. И введены конструкторы инициализации. Проверялось на http://cpp.sh/ и на https://gcc.godbolt.org/ транслятор x86-64 gcc 7.2.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, есть код определяющий модель чипа видеокарты в данном случае моя карта - это NVIDIA Gefore GTX 970 как мне из модели чипа вытащить только...
Прохожу задание в книге Алекса ЭллайнаПосле темы указателей и ссылок в одном из проверочных заданий, он просит написать написать программу...
Вы пытаетесь захватить info по значению, а так нельзя - это массивЗахватывайте по ссылке - &info