Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2021, 11:03   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Конструкторы при наследовании.

Здравствуйте!
Изучаю С++ и прохожу наследование.
Книга Р. Лафоре.
Есть код, в отношении которого VS-2019 выдаёт ошибку, хотя код точь в точь как в книге.
В производном классе ругается на конструктор. Подскажите пожалуйста, почему?
Вот код:
Код:
// englen.cpp
// наследование в программе перевода английских мер длины
#include <iostream>
using namespace std;
enum posneg { pos, neg };
///////////////////////////////////////////////////////////
class Distance // класс для английских мер длины
{
  protected:   // заметьте, что private использовать нельзя
    int feet;
    float inches;
  public:
    // конструктор без параметров
    Distance ( ) : feet ( 0 ), inches ( 0.0 )
      { }
    // конструктор с двумя параметрами
    Distance ( int ft, float in ) : feet ( ft ), inches ( in )
      { }
    // получение значений от пользователя
    void getdist ( )
      {
        cout << "\nВведите футы: "; cin >> feet;
        cout << "Введите дюймы: "; cin >> inches;
      }
    // вывод значений на экран
    void showdist ( )
      { cout << feet << "\'" << inches << '\"'; }
};
///////////////////////////////////////////////////////////
class DistSing : public Distance // добавление знака к длине
{
  private:
    posneg sing;                 // значение может быть pos или neg
  public:
    // конструктор без параметров
    DistSign ( ) : Distance ( )
      { sign = pos; }
    // конструктор с двумя или тремя параметрами
    DistSign ( int ft, float in, posneg sg = pos ) :
      Distance ( ft, in )      // вызов конструктора базового класса
      { sign = sg; }           // начальная установка знака
    void getdist ( )           // ввод пользователем длины
      {
        Distance::getdist ( ); // вызов функции getdist из базового класса
        char ch;               // запрос знака
        cout << "Введите знак (+ или -): "; cin >> ch;
        sign = ( ch == '+' ) ? pos : neg;
      }
    void showdist ( ) const    // вывод расстояния
      {
        // вывод всей информации, включая знак
        cout << ( ( sign == pos ) ? "(+)" : "(-)" );
        Distance::showdist ( );
      }
};
///////////////////////////////////////////////////////////
int main ( )
{
  DistSign alpha;                   // используем конструктор по умолчанию
  alpha.getdist ( );                // получаем данные от пользователя

  DistSign beta ( 11, 6.25 );       // конструктор с двумя аргументами

  DistSign gamma ( 100, 5.5, neg ); // конструктор с тремя аргументами

  // выводим данные для всех переменных
  cout << "\nA = "; alpha.showdist ( );
  cout << "\nB = "; beta.showdist ( );
  cout << "\nC = "; gamma.showdist ( );
  cout << endl;
  return 0;
}
А вот здесь он ругается:
Изображения
Тип файла: jpg Скриншот 06-05-2021 101441.jpg (52.8 Кб, 0 просмотров)
Тип файла: jpg Скриншот 06-05-2021 101423.jpg (51.3 Кб, 0 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 06.05.2021, 12:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Для вас есть разница между "DistSign" i "DistSing"?
waleri вне форума Ответить с цитированием
Старый 06.05.2021, 12:29   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Для вас есть разница между "DistSign" i "DistSing"?
Не понял ваш вопрос.
KAMLS вне форума Ответить с цитированием
Старый 06.05.2021, 12:35   #4
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Код:
class DistSing : public Distance
Код:
DistSign ( ) : Distance ( )
Разницу видите в именах?
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 06.05.2021, 12:45   #5
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Разницу видите в именах?
Наверное происходит какое-то недопонимание.
Есть весьма толковая книга-учебник Р.Лафоре по С++. Этот пример оттуда, стр. 373-374, можно посмотреть в электронном виде, глава наследование. Этот код придумал не я. Я - учусь. VS 2019 показал ошибку. Я хочу узнать у знающих - почему?
Вот здесь https://metanit.com/cpp/tutorial/5.10.php кстати похожий код есть, на скриншоте видно, что в производном классе, конструктор имеет имя своего класса, а после двоеточия ссылается на базовый класс.
Изображения
Тип файла: png Снимок.PNG (13.6 Кб, 14 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 06.05.2021, 12:59   #6
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Есть весьма толковая книга-учебник Р.Лафоре по С++. Этот пример оттуда, стр. 373-374, можно посмотреть в электронном виде, глава наследование. Этот код придумал не я.
Лучше читайте оригиналы учебников а не искаженные переводы.
И если просто копипастить код не вникая в смысл, то так ни чему и не научитесь.

P. S.
Цитата:
Сообщение от KAMLS Посмотреть сообщение
Я хочу узнать у знающих - почему?
Вам ведь уже два раза, два различных человека подсказали. Проблема в имени класса.
I am not a wizard, I am just learning.

Последний раз редактировалось Desc; 06.05.2021 в 13:01. Причина: Добавил P. S.
Desc вне форума Ответить с цитированием
Старый 06.05.2021, 13:06   #7
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Для вас есть разница между "DistSign" i "DistSing"?
Прошу прощения, всё-таки увидел)))
KAMLS вне форума Ответить с цитированием
Старый 06.05.2021, 13:16   #8
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Код подправил. Дело в том, что я скачал листинги примеров с издательского сайта. Такие вот там были опечатки помноженные на мою невнимательность.
Но и в подправленном виде появилась ошибка. Причем прямо сверху на скриншоте видно, что такое же использование метода базового класса нормально проходит.
Изображения
Тип файла: jpg Скриншот 06-05-2021 131204.jpg (51.8 Кб, 0 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 06.05.2021, 13:26   #9
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Код подправил.
Вопрос решен. const был лишним. Код работает.
KAMLS вне форума Ответить с цитированием
Старый 07.05.2021, 16:09   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
const был лишним
точнее - не хватало const, его нужно дописать в Distance::showdist
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатель при приведении в множ. наследовании luminoforest Общие вопросы C/C++ 0 07.07.2018 17:18
Полиморфизм и вызов функции при наследовании Даша1046 Общие вопросы C/C++ 6 01.06.2015 23:03
Проблема с методом при наследовании rommster Общие вопросы C/C++ 7 15.09.2011 18:56
Как вызываются конструкторы объектов при наследовании? TwiX Общие вопросы C/C++ 10 17.11.2010 13:59
Перегрузка == при наследовании paramon Общие вопросы C/C++ 5 17.06.2008 00:17