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

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

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

Вместо включения используйте закрытое наследование - C++

25.07.2014, 13:29. Просмотров 730. Ответов 7
Метки нет (Все метки)

Здравствуйте. Изучаю С++ по книге Прата С. "Язык программирования С++. Лекции и упражнения". Столкнулся с проблемой.
Есть задание: Выполните еще раз упражнение 1, но вместо включения используйте закрытое
наследование. Здесь также могут пригодиться несколько объявлений typedef.
Подумайте, как можно применить следующие операторы:
PairArray::operator=(PairArray(Arraylnt() , Arraylnt()));
cout << (const string &)(*this);
Полученный класс должен работать с тестовой программой, приведенной в
упражнении 1.
Все сделал, все работает. cout << (const string &)(*this) нашел применение сам собой. А вот PairArray::operator=(PairArray(Arraylnt() , Arraylnt())) - понятия не имею куда определить. Куда я его только не пробовал пихать: в конструкторы, в перегруженную операцию присваивания, в main() что-то пытался чудить. Везде ошибки. Смысл этого оператора понятен: вызывается перегруженная операция присваивания из класса PairArray. В качестве аргумента выступает безымянный объект класса PairArray, который , в свою очередь, создается конструктором Pair(const T1 & aval, const T2 & bval). В качестве аргументов конструктора Pair выступают valarray<int>(), то есть массивы с нулевым размером.
Помогите пожалуйста определить, куда нужно вставить этот оператор: PairArray::operator=(PairArray(Arraylnt() , Arraylnt())). Само собой, оператор должен оставаться в неизменном виде, как этого требует задание.
Код программы представлен ниже. Программа полностью работоспособна.
1) Заголовочный файл:
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
template <class T1, class T2> 
class Pair
{ 
private: 
T1 a; 
T2 b; 
public: 
T1 & first() { return a; } 
T2 & second() { return b; } 
T1 first () const { return a; } 
T2 second() const { return b; }
Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) { }
Pair() {}
Pair<T1,T2> & operator=(Pair<T1,T2> & P);
};
 
typedef valarray<int> ArrayInt;
typedef Pair<ArrayInt,ArrayInt> PairArray;
 
 
 
class Wine : private PairArray, private string {
private:
    int count;
public:
    Wine() : string("none"), PairArray(), count(0) {}
    Wine(const char * l, int y, const int yr[], const int bot[]) : string(l), count(y), PairArray(ArrayInt (yr,y),ArrayInt (bot,y)) {}
    Wine(const char * l, int y) : string(l), count(y), PairArray(ArrayInt (y),ArrayInt (y)) {}
    void GetBottles();
    const string & Label() { return (const string &) (*this); }
    int sum() const;
    void Show() const;
};
2) Файл реализации:
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
template <class T1, class T2>
Pair<T1,T2> & Pair<T1,T2>::operator=(Pair<T1,T2> & P) {
    a=P.a;
    b=P.b;
    return *this;
}
 
 
void Wine::GetBottles() {
    cout << "Enter " << Label() << " data for " << count << " year(s): \n";
    for(int i=0;i<count;i++) {
        cout << "Enter year: ";
        cin >> PairArray::first()[i];
        cout << "Enter bottles for that year: ";
        cin >> PairArray::second()[i];
    }
}
int Wine::sum() const {
    int sum=0;
    for(int i=0;i<count;i++) sum+=PairArray::second()[i];
    return sum;
}
void Wine::Show() const {
    cout << "Wine: " << (const string &)(*this) << endl;
    cout << "\tYear\tBottles\n";
    for(int i=0;i<count;i++) cout << "\t" << PairArray::first()[i] << "\t" << PairArray::second()[i] << endl;
}
3) Файл исходного кода:
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
void main() {
setlocale(LC_ALL,"Russian");
 
 
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); // сохранение названия, лет, 
// создание массивов из yrs элементов 
holding.GetBottles(); // предложение ввести год и количество бутылок 
holding.Show(); // вывод содержимого объекта 
Wine Tempp;
const int YRS = 3; 
int y[YRS] = {1993, 1995, 1998}; 
int b[YRS] = { 48, 60, 72};
// Создание нового объекта, инициализация 
// с использованием данных из массивов у и b 
Wine more("Gushing Grape Red",YRS, y, b) ; 
more.Show(); 
cout << "Total bottles for " << more.Label() // используется метод Label() 
<< ": " << more.sum() << endl; // используется метод sum() 
cout << "Bye\n"; 
 
 
cout << "\nDone!\n\n";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 13:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вместо включения используйте закрытое наследование (C++):

закрытое наследование - C++
Объясните, плиз. Заранее спасибо В классе Base поле X находится в части private, производный класс объявлен так: class Derived:...

Закрытое наследование - C++
Помогите, пожалуйста, ответить на такой вопрос: Что такое переопределение методов (в производном классе)? Продемонстрировать его...

Закрытое наследование - C++
Добрый день, форум:) Помогите разобраться: Базовый класс vector и от него наследую допустим &quot;очередь&quot; , и.. когда хочу в очереди...

Закрытое наследование. Вывод строки - C++
Здравствуйте. Необходимо вывести элемент класса std::string в данном случае: class Wine : protected Pair, private string { int...

Закрытое наследование, как добраться до функции? - C++
Всем привет! Собственно, я никак не могу понять, как мне использовать функцию sum(), класса valarray, находящегося в pair при закрытом...

Виртуальные базовые классы/закрытое наследование - C++
Хотел уточнить правильно ли я понял материал. Если я породил два класса через виртуальное, открытое наследование от одного базового класса,...

7
zahvad
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 8
29.07.2014, 11:13  [ТС] #2
Сам додумался. Оператор "PairArray::operator=(PairArray(Arraylnt() , Arraylnt()));" делает ни что иное, как очистку части PairArray из любого класса - потомка. То есть он создает пустой объект PairArray и присваивает его вызвавшему. Исходя из этого я определил метод в классе Wine:
C++
1
2
3
4
5
void Wine::Clear() {
    count=0;
    string::operator=("none");
    PairArray::operator=(PairArray(ArrayInt() , ArrayInt()));
}
Как видите, оператор "PairArray::operator=(PairArray(ArrayInt() , ArrayInt()));" находится в ней в неизменном состоянии, как этого и требует задание. Метод прекрасно функционирует, очищая объект а точнее, приводя его в такое состояние, которое создает конструктор по умолчанию.
Надеюсь, это кому-то поможет.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.07.2014, 15:17 #3
Цитата Сообщение от zahvad Посмотреть сообщение
Файл реализации:
C++
1
template <class T1, class T2>
реализация шаблона должны быть в хедере

Добавлено через 57 секунд
Цитата Сообщение от zahvad Посмотреть сообщение
C++
1
void main() {
это тоже Прата научил?
0
zahvad
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 8
29.07.2014, 15:40  [ТС] #4
Цитата Сообщение от Jupiter Посмотреть сообщение
реализация шаблона должны быть в хедере
Я знаю, спасибо. Эту часть кода я взял из книги. Она, как не странно, работает. Сам удивился.
Цитата Сообщение от Jupiter Посмотреть сообщение
это тоже Прата научил?
А что не так? Зато "return 0;" в конце не нужен, как в случает с "int main()".
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
29.07.2014, 15:42 #5
zahvad, Не так то, что это нестандартно. Есть несколько стандартных объявлений функции main. Но во всех них она должна возвращать int. Ну и да, return 0 не обязателен в любом случае, в С++ по дефолту из main возвращается 0.
0
zahvad
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 8
29.07.2014, 16:02  [ТС] #6
Если оно всегда работает, то все равно не стоит использовать мой вариант? Если не стоит, объясните пожалуйста подробно, чем вариант "int main()" лучше? Мне интересно разобраться в тонкостях языка.
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
29.07.2014, 16:07 #7
Тем, что программа должна вернуть хоть какое то значение системе при завершении. В стандарте языка есть несколько прототипов функции main и все они возвращают int. Как уже сказалаи, в C++ необязательно возвращать 0 из этой функции, это подразумевается по умолчанию. То, что работает прототип void main() - отголоски прошлого. Многие современные компиляторы уже не пропустят такой код.
0
zahvad
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 8
29.07.2014, 16:14  [ТС] #8
Цитата Сообщение от Toshkarik Посмотреть сообщение
Тем, что программа должна вернуть хоть какое то значение системе при завершении. В стандарте языка есть несколько прототипов функции main и все они возвращают int. Как уже сказалаи, в C++ необязательно возвращать 0 из этой функции, это подразумевается по умолчанию. То, что работает прототип void main() - отголоски прошлого. Многие современные компиляторы уже не пропустят такой код.
Понял, спасибо. Буду знать.
0
29.07.2014, 16:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 16:14
Привет! Вот еще темы с ответами:

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

Как используя закрытое наследование использовать 2 объекта базового класса? - C++
Доброго времени суток. Учусь по книге &quot;Прата С. Язык программирования C++. Лекции и упражнения. Не могу понять упражнение...(глава 14,...

вместо механизма RTTI языка C++ используйте свою собственную модель RTTI - C++
В примере вместо механизма RTTI языка C++ используйте свою собственную модель RTTI. Включите в базовый класс виртуальную функцию whatAmI()...

Выполните, пожалуйста, задание, при этом вместо оператора цикла while используйте оператора цикла do_while - C++
Используя оператор цикла while, напишите программу для вычисления ниже следующей суммы. // fkdj.cpp: определяет точку входа...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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