Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
#1

Производный класс, аргументы по умолчанию - C++

14.06.2013, 07:02. Просмотров 531. Ответов 7
Метки нет (Все метки)

Здравствуйте. Есть базовый класс и производный. Проблема в том что в производном классе надо сделать один аргумент, который наследуется от базового класса, по умолчанию, но по условии задания я могу редактировать только определения класса, а я этот самый аргумент даже передать не могу в производный так как он не объявлен в конструкторе производного класса.

Чтобы вам было удобней я выделил жирным и курсивным шрифтом проблемные участки.

Заголовочный файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
class Port
{
private:
    char * brand;
    char style[20];
    int bottles;
public:
    [B]Port(const char * br = "none", [I]const char * st = "none"[/I], int b = 0);[/B]
    Port(const Port & p);
    virtual ~Port(){delete [] brand;}
    Port & operator= (const Port & p);
    Port & operator+= (int b);
    Port & operator-= (int b);
    int BottleCount() const {return bottles;}
    virtual void Show() const;
    friend ostream & operator<< (ostream & os, const Port & p);
};
 
class VintagePort : public Port
{
private:
    char * nickname;
    int year;
public:
    VintagePort();
    [B]VintagePort(const char * br, int b, const char * nn, int y);[/B]
    VintagePort(const VintagePort & vp);
    ~VintagePort(){delete [] nickname;}
    VintagePort & operator=(const VintagePort & vp);
    void Show() const;
    friend ostream & operator<<(ostream & os, const VintagePort & vp);
};
Определения классов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "dma.h"
#include <cstring>
Port::Port(const char * br, const char * st, int b)
{
    brand = new char[std::strlen(br) + 1];
    strcpy(brand, br);
    
    strcpy(style, st);
    bottles = b;
}
 
void Port::Show() const
{
    cout << "Brand: " << brand << endl <<
            "Kind: " << style << endl <<
            "Bottles: " << bottles << endl;
};
 
std::ostream & operator<<(std::ostream & os, const Port & hs)
{
    os << hs.brand << ", " << hs.style << ", " << hs.bottles << std::endl;
    return os;
}
 
Port & Port::operator+=(int b)  //добавляем бутылки в подвал
{
    bottles += b;
    return *this;
}
 
Port & Port::operator-=(int b)  //забераем бутылки из подвала
{
    if(bottles <= b)
    bottles = 0;
    else
    bottles -= b;
    return *this;
}
 
Port & Port::operator=(const Port & p)  //добавляем бутылки в подвал
{
    brand = new char[std::strlen(p.brand) + 1];
    strcpy(brand, p.brand);
    strcpy(style, p.style);
    bottles = p.bottles;
    return *this;
}
 
[B]VintagePort::VintagePort(const char * br, int b, const char * nn, int y) : Port(br, [I]st[/I], b)
{
    
}[/B]
Само использование, правда только базового класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include "dma.h"
#include <cstdlib>
 
int main()
{
   Port object1("Gallo", "tawny", 20);
   object1.Show();
   cout << object1;
   object1 += 5;
   cout << object1;
   object1 -=15;
   cout << object1;
 
   Port object2;
   object2 = object1;
   cout << endl <<  object2;
   system("PAUSE");
   return 0; 
}
Добавлено через 3 минуты
Думал что выделил , но там видно теги. Кстати, зачем нужны конструкторы копирования? Они выполняют какую-то автоматическую роль, или они работаю как по типу перегруженных "<<", "="? Тоже никак не могу вкурить...

Добавлено через 47 минут
Если это нельзя реализовать, то тоже пишите, хоть буду знать что что-то неправильно понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2013, 07:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Производный класс, аргументы по умолчанию (C++):

Разработать производный от абстрактного класса Figure класс и класс, производный от производного - C++
Разработать базовый абстрактный класс Figure с пустым виртуальным методом print для вывода в дальнейшем полной информации об объекте: ...

Создайте производный класс с дополнительными полями, конструктором по умолчанию и методами чтения/изменения значений этих полей - C++
Помогите! Завтра экзамен,времени нет! Заранее спасибо. 11. На базе заданного класса создайте производный класс с дополнительными полями,...

Есть производный класс и базовый; при чём производный использует только ЧАСТЬ ресурсов базового, правильно ли это? - C++
Ну то есть базовый класс A, с полями, допустим, a, b, c, d. И я проектирую производный класс B и я железно знаю, что он будет использовать...

Создать класс Point и производный класс ColoredPoint (цветная точка) - C++
Создайте класс Point (точка на плоскости), характеризующийся двумя координатами. Создайте производный класс ColoredPoint (цветная точка), в...

Разработать класс Man (человек) и производный класс Student (студент). Описать атрибуты. - C++
Разработать класс Man (человек) и производный класс Student (студент). Описать атрибуты.

Разработать класс Tableware (посуда) и производный класс Dish (тарелка). Описать атрибуты - C++
Разработать класс Tableware (посуда) и производный класс Dish (тарелка). Описать атрибуты.

7
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
14.06.2013, 08:50 #2
пока у меня только такие мыслишки:
создаем два экземпляра VintagePort
один своим конструктором
C++
1
2
VintagePort *vp1;
vp1 = new VintagePort("brand", 1, "nickname", 1970);
второй конструктором Port, чтобы задать style:
C++
1
2
VintagePort *vp2;
vp2 = (VintagePort) new Port("my_vp_style");
потом копируем второй в первый,
C++
1
vp1=vp2;
и все будет при нём...
осталось только хитро описать конструктор копирования для VintagePort
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,619
Записей в блоге: 3
Завершенные тесты: 1
14.06.2013, 09:06 #3
Как вариант, в списке инициализации вызвать конструктор базового класса без параметров, а потом инициализировать только необходимые значения, остальные останутся теми, что были по умолчанию для базового
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
14.06.2013, 10:13 #4
Цитата Сообщение от Croessmah Посмотреть сообщение
вызвать конструктор базового класса без параметров, а потом инициализировать только необходимые значения, остальные останутся теми, что были по умолчанию для базового
так не получится инициализировать style базового класса, т.к. он не protected
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,619
Записей в блоге: 3
Завершенные тесты: 1
14.06.2013, 10:28 #5
Цитата Сообщение от AntonChik Посмотреть сообщение
так не получится инициализировать style базового класса, т.к. он не protected
Значение ему будет присвоено в конструкторе базового класса
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
14.06.2013, 12:47 #6
Цитата Сообщение от Croessmah Посмотреть сообщение
в списке инициализации вызвать конструктор базового класса без параметров
тогда почему без параметров?
как раз в этот момент и надо инициализировать style
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,619
Записей в блоге: 3
Завершенные тесты: 1
14.06.2013, 13:05 #7
Цитата Сообщение от AntonChik Посмотреть сообщение
тогда почему без параметров?
как раз в этот момент и надо инициализировать style
Я так понял, что нужно его инициализировать значением по умолчанию. Хотя черт его знает что нужно ТС
0
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
14.06.2013, 17:06  [ТС] #8
Но значение по умолчанию должно быть новое для производного класса, а не "none", как у базового.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 17:06
Привет! Вот еще темы с ответами:

Аргументы по умолчанию C++ - C++
Здравствуйте! Подскажите пожалуйста как можно присвоить строку &quot;Hello&quot; переменной *char в прототипе функции, чтобы *a была по умолчанию...

Создать базовый класс - Array и производный класс - Money для работы денежной суммы - C++
ПОМОГИТЕ, ПОЖАЛУЙСТА, С ЗАДАЧЕЙ Создать базовый класс - Array и производный класс - Money для работы денежной суммы

Создать базовый класс Car (машина) и производный класс Lorry (грузовик): ООП ошибки - C++
Создать базовый класс Car (машина), характеризуемый торговой маркой (строка), числом цилиндров, мощностью. Определить методы переназначения...

Наследование: базовый класс Квадрат, производный класс Пирамида - C++
Помогите, пожалуйста!:cry: Добавлено через 6 минут Создать класс КВАДРАТ, член класса- длинна стороны. Предусмотреть в классе методы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
14.06.2013, 17:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru