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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обеспечить работу приложения с БД Firebird на других ПК http://www.cyberforum.ru/cpp-beginners/thread1233780.html
Добрый день. Есть программа с бд на firebird, как скомпилировать программу так, что бы на компьютере где нет firebird она запускалась и работала?
C++ Изучение С++ с нуля Всем привет. Вчера зарегистрировался на форуме. Хочу изучить C++, но нет никаких знаний в этом направлении. Какие книги можно почитать абсолютному начинающему, который вообще не в курсе что такое программирование??? Как изучить C++ основательно, чтоб без пробелов? может начать с математики. короче у вас большой опыт. помогите... особыми умственными способностями, мягко говоря, не обладаю.... http://www.cyberforum.ru/cpp-beginners/thread1233756.html
C++ Конкатенация строк: Зачем строки создаются в динамической памяти?
Есть программа, которая делает конкатенацию строк. #include <iostream> using namespace std; char* Concatenate(char* string1, char* string2) { int lengthString1 = GetLength(string1); int lengthString2 = GetLength(string2); int lengthString3 = lengthString1 + lengthString2; int charString1 = 0;
C++ Помогите найти ошибку в решении биквадратного уравнения
Здравствуйте,написал код,проблема в том,если выполняется строка 31,то и всегда будет выполнятся строка под номером 39,как это исправить? писал по алгоритму,должно быть все правильно. Программа работает хорошо,только выводит на экран пару лишних иксов. Для примера можно взять 4(x^4)- 5(x^2)+1=0. Ответ равен 1, -1, 0.5, -0.5; у меня выбивает следующие: x1=1; x2=-1; x3=0.5; x4=-0.5; x1=-1; x2=1; -...
C++ Как обратиться к свойству класса http://www.cyberforum.ru/cpp-beginners/thread1233666.html
Нубский вопрос, вот код: #include "stdafx.h" #include <iostream> using namespace std; class HelloClass
C++ Выяснить, сколько бюллетеней осталось необработанными В стране Виртландии раз в пять лет проходят выборы президента. И каждый раз после завершения голосования появляется необходимость подсчитать результаты. Рассмотрим процесс обработки бюллетеней в Виртландии. Всего в Виртландии голосуют n человек, соответственно необходимо обработать n бюллетеней, которые пронумерованы от 1 до n. Обработка длится k дней. Каждый день члены избирательной комиссии... подробнее

Показать сообщение отдельно
zahvad
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 8

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

25.07.2014, 13:29. Просмотров 639. Ответов 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";
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru