изучаю “Наследование”, возникает ошибка

243
06 сентября 2017, 14:56

Объясните пожалуйста, где ошибка ? Пометил комментариями ошибку. За пример взял перегрузку операции.

#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;
}

Answer 1
  1. Рекомендуется передавать аргумент в функцию (оператор) по ссылке а не по значению. Вот так:

Counter operator + (Counter& t2)

  1. Странный оператор вычитания в NewCounter реализует почему-то сложение.

  2. Собственно ответ на вопрос. Доступа к члену count у типа Counter вне его методов нету так как член протектированный. Сделайте вот так:

Counter operator -(NewCounter& t2) 
{
    return (this->count + t2.count);
}
  1. Если нужен оператор вычитания (сложения?) именно с Counter то либо надо объявлять друга либо вводить функцию доступа get. Либо делать открытым член 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.

READ ALSO
C++ Поиск слова в строке

C++ Поиск слова в строке

Здравствуйте, есть код определяющий модель чипа видеокарты в данном случае моя карта - это NVIDIA Gefore GTX 970 как мне из модели чипа вытащить только...

690
Динамические структуры в c++

Динамические структуры в c++

Прохожу задание в книге Алекса ЭллайнаПосле темы указателей и ссылок в одном из проверочных заданий, он просит написать написать программу...

308
Error C2075 при инициализации массива

Error C2075 при инициализации массива

Вы пытаетесь захватить info по значению, а так нельзя - это массивЗахватывайте по ссылке - &info

261