Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для dremer
9 / 9 / 2
Регистрация: 18.06.2012
Сообщений: 33

Как используя закрытое наследование использовать 2 объекта базового класса?

15.08.2013, 22:32. Показов 1464. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Учусь по книге "Прата С. Язык программирования C++. Лекции и упражнения.
Не могу понять упражнение...(глава 14, упр 2)
Выполните еще раз упражнение 1, но вместо включения используйте закрытое наследование.
С классом string всё понятно, но как сделать 2 объекта класса valarray?
Упражнение 1 ниже.
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//head.h
#ifndef HEAD_H_
#define HEAD_H_
#include <valarray>
using std::string;
class Wine {    
private:
    typedef std::valarray<int> ArrayInt;
    typedef std::pair< ArrayInt, ArrayInt > PairArray;
    string label;
    PairArray PA;
public:
    Wine(const char *l, int y, const int yr[], const int bot[]);
    Wine(const char *l, int y);
    Wine();
    ~Wine();
    void GetBottles();
    const string & Label() const;
    int sum() const;
    void show() const;
};
#endif
Кликните здесь для просмотра всего текста
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
//методы для заголовочного файла
#include "head.h"
#include <iostream>
#include <valarray>
Wine::Wine()
{
    label = "noname";
    PA.first = std::valarray<int>(1);
    PA.second = std::valarray<int>(1);
}
Wine::Wine(const char *l, int y)
{
    label = l;
    PA.first = std::valarray<int>(y);
    PA.second = std::valarray<int>(y);
}
Wine::Wine(const char *l, int y, const int yr[], const int bot[])
{
    label = l;
    PA.first = std::valarray<int>(yr, y);
    PA.second = std::valarray<int>(bot, y);
}
void Wine::GetBottles()
{
    std::cout << "Enter " << label << " data for " << PA.first.size() << " year(s):\n";
    for (std::size_t i = 0; i < PA.first.size(); i++)
    {
        std::cout << "Enter year: ";
        std::cin >> PA.first[i];
        std::cout << "Enter bottles for that year: ";
        std::cin >> PA.second[i];
    }
 
}
const std::string & Wine::Label() const {
    return label;
}
int Wine::sum() const {
    return PA.second.sum();
}
Wine::~Wine()
{}
void Wine::show() const
{
    std::cout << "Wine: " << label << std::endl;
    std::cout << '\t' << "Year    " << "Bottles\n";
    for (std::size_t i = 0; i < PA.first.size(); i++)
        std::cout << '\t' << PA.first[i] << "    " << PA.second[i] << std::endl;
}
Кликните здесь для просмотра всего текста
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
//main.cpp
#include <iostream>
#include <valarray>
#include "head.h"
int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    cout << "Enter name of wine: ";
    char lab[50];
    cin.getline(lab, 50);
    cout << "Enter number of years: ";
    int yrs;
    cin >> yrs;
    Wine holding(lab, yrs);
    holding.GetBottles();
    holding.show();
    const int YRS = 3;
    int y[YRS] = {1993, 1995, 1998};
    int b[YRS] = {48, 60, 72};
    Wine more("Gushing Grape Red", YRS, y, b);
    more.show();
    cout << "Total bottles for " << more.Label()
         << ": " << more.sum() << endl;
    cout << "Bye\n";
    return 0;
}

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2013, 22:32
Ответы с готовыми решениями:

Что делать если нужно знести информацию в 2 разных объекта базового класса при закрытом наследование
Что делать если нужно знести информацию в 2 разных объекта базового класса при закрытом наследование? Например мне нужно держать скажем имя...

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

Наследование:переменные базового класса
В общем по книге Г.Шилдт делал пример из книги и почему то выдаёт много ошибок. using System; using System.Collections.Generic; ...

2
2 / 2 / 1
Регистрация: 29.01.2013
Сообщений: 47
15.08.2013, 23:15
я так делал/
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//header.h
#include <iostream>
#include <string>   
#include <valarray>
#include <cstring>
using namespace std;
template <class T1, class T2>
class Pair
{
private:
    T1 a;
    T2 b;
public:
    Pair(const T1 & aval, const T2 & bval);
    void SetPair(int n);
    Pair() {}
    void Show(int n);
    int Sum();
    ~Pair() {}
};
typedef std::valarray<int> ArrayInt;
typedef Pair<ArrayInt, ArrayInt> PairArray;
class Wine: private std::string, PairArray
{
private:
    int years;
public:
    void GetBottles();
    int Sum();
    string & Label();
    void Show();
    Wine(const char * l, int y, const int yr[],const int bot[]);
    Wine() {}
    ~Wine () {}
    Wine(const char * l, int y):string(l),PairArray(ArrayInt (y),ArrayInt (y)){}
    friend istream & getline(istream & s,Wine & cl);
};
template <class T1, class T2>
void Pair<T1,T2>::SetPair(int n)
{
    a.resize(n);
    b.resize(n);
    for(int i=0;i<n;i++)
    {
        cout<<"Enter year: ";
        cin>>a[i];
        cin.get();
        cout<<"Enter bottles for that year: ";
        cin>>b[i];
        cin.get();
    }
}
 
void Wine::GetBottles()
{
    cout<<"Enter name of wine: ";
    getline(cin,*this);
    cout<<"Enter number of years: ";
    cin>>years;
    cout<<"Enter "<<Label()<<" data for "<<years<<" year(s):\n";
    PairArray::SetPair(years);
 
}
istream & getline(istream & s,Wine & cl)
{
    getline(s,(string &)cl);
    return s;
}
template <class T1, class T2>
Pair<T1,T2>::Pair(const T1 & aval, const T2 & bval)
{
    a.resize(sizeof(aval)/4);
    b.resize(sizeof(aval)/4);
    for(int i=0;i<(sizeof(aval)/4);i++)
    {
        a[i]=aval[i];
        b[i]=bval[i];
    }
}
template <class T1, class T2>
void Pair<T1,T2>::Show(int n)
{
    cout<<a[n]<<"  "<<b[n]<<endl;
}
template <class T1, class T2>
int Pair<T1,T2>::Sum()
{
    int c=0;
    for(int i=0;i<a.size();i++)
        c+=b[i];
    return c;
}
 
int Wine::Sum()
{
    return PairArray::Sum();
}
 
string & Wine::Label()
{
    return (string &)(*this);
}
 
void Wine::Show()
{
    cout<<"Wine: "<<Label()<<endl;
    for(int i=0;i<years;i++)
        PairArray::Show(i);
}
Wine::Wine(const char * l, int y, const int yr[],const int bot[]):  string(l),PairArray(ArrayInt (yr,y),ArrayInt (bot,y))
{
    years=y;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//main.cpp
#include <iostream>
#include "header.h"
using namespace std;
int main(void)
{
    int k[]={1,3,4};
    int v[]={2,3,4};
    Wine holding;
    holding.GetBottles();
    holding.Show();
    const int yer=3;
    int y[yer]={1993, 1995, 1998};
    int b[yer]={48, 60, 72};
    Wine more("Gushing Grape Red",yer,y,b);
    more.Show();
    cout<<"Total bottles for "<<more.Label()<<": "<<more.Sum()<<endl;
    cout<<"Bye\n";
    system("PAUSE");
    return 0;
}
1
 Аватар для dremer
9 / 9 / 2
Регистрация: 18.06.2012
Сообщений: 33
15.08.2013, 23:25  [ТС]
underwaterspace, Спасибо.
Я думал, что pair это шаблонный класс из std:: и наследовал вместо него std::valarray<int> =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.08.2013, 23:25
Помогаю со студенческими работами здесь

Наследование и члены базового класса
Господа скажите пожалуйста, если в базовом классе есть конструктор, который принимает один целочисленный параметр, который в дальнейшем...

Наследование конструктора из базового класса
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; //////////////////// class String { ...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

Запретить наследование члена базового класса
class A { public: int a; virtual void F()=0; }; Можно ли запретить наследование поля &quot;а&quot; классу...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru