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

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

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

Доступ к объекту базового класса при закрытом наследовании - C++

06.03.2013, 10:34. Просмотров 411. Ответов 5
Метки нет (Все метки)

Есть класс Pair из стандартной библиотеки. Он у меня содержит 2 массива valarray. От класса Pair я создаю наследника Wine. В классе Wine есть функция GetBottles, которая записывает данные в оба массива Pair.
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
#pragma once
#include <valarray>
 
typedef std::valarray<int> ArrayInt;
typedef std::pair<ArrayInt, ArrayInt> PairArray;
 
class Wine : PairArray
{
    int yr;
    
public:
    Wine(const int y, const int yr[], const int bot[]);
    Wine(int y);
    ~Wine(void) {}
    void GetBottles();
    int sum();
    void Show();
};
 
Wine::Wine(const int y, const int yr[], const int bot[]) : yr(y), PairArray(ArrayInt(yr, y), ArrayInt(bot, y))
{
}
 
Wine::Wine(int y) : yr(y) 
{
}
 
void Wine::GetBottles()
{
    std::cout << "Enter data for " << yr << " year(s): \n";
    for (int i = 0; i < yr; ++i) {
        std::cout << "Enter year: ";
        std::cin >> ((PairArray&) (*this)).first[i]; //вот в этом месте программа падает
        std::cout << "Enter bottles for that year: ";
        std::cin >> ((PairArray&) (*this)).second[i];
    }
}
 
void Wine::Show()
{
    for (int i = 0; i < yr; ++i) {
        std::cout << "\t" << ((PairArray&) (*this)).first[i];
        std::cout << "   " << ((PairArray&) (*this)).second[i] << std::endl;
    }
}
 
int Wine::sum()
{
    return PairArray::second.sum();
}
При вызове функции GetBottles и попытке записи в элемент массива valarray класса Pair программа падает. Подскажите в чем ошибка? Как правильно получить доступ к членам массива valarray из класса Wine?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2013, 10:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Доступ к объекту базового класса при закрытом наследовании (C++):

Доступ к переменным базового класса при наследовании - C++
Есть следующий код class Base { protected: int x; Base* enemy; public: Base() {}

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

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

Неявное восходящее преобразование при защищенном/закрытом наследовании - C++
Здравствуйте. Читаю книгу Стивена Прата по C++. Попался непонятный момент: в одной таблице (в таблице 14.1 в 6-й рус. редакции на стр....

Бинарное дерево подклассов основного класса-узла. Доступ к подклассам по указателю - объекту класса-родителя - C++
Короче, необходимо сделать бинарное дерево, решающее арифметическое выражение, предварительно туда записанное. Есть основной класс...

Доступ к параметрам и функциям базового класса - C++
Собственно вот код: class okno : public zakaz { public: xy razmer; vector &lt;xy&gt; paket; vector &lt;int&gt; impost; vector &lt;xy&gt;...

5
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
06.03.2013, 11:00 #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
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
#include <valarray>
#include <iostream>
 
typedef std::valarray<int> ArrayInt;
typedef std::pair<ArrayInt, ArrayInt> PairArray;
 
class Wine : PairArray
{
    int yr;
    
public:
    Wine(const int y, const int yr[], const int bot[]);
    Wine(int y);
    ~Wine(void) {}
    void GetBottles();
    int sum();
    void Show();
};
 
Wine::Wine(const int y, const int yr[], const int bot[]) : PairArray(ArrayInt(yr, y), ArrayInt(bot, y)), yr(y)
{
}
 
Wine::Wine(int y) : yr(y) 
{
}
 
void Wine::GetBottles()
{
    std::cout << "Enter data for " << yr << " year(s): \n";
    for (int i = 0; i < yr; ++i) {
        std::cout << "Enter year: ";
        std::cin >> first[i];
        std::cout << "Enter bottles for that year: ";
        std::cin >> second[i];
    }
}
 
void Wine::Show()
{
    for (int i = 0; i < yr; ++i) {
        std::cout << "\t" << first[i];
        std::cout << "   " << second[i] << std::endl;
    }
}
 
int Wine::sum()
{
    return PairArray::second.sum();
}
 
int main()
{
   const int yr[] = {0, 1, 2};
   const int bot[] = {10, 11, 12};
   Wine w(3, yr, bot);
   w.Show();
   return 0;
}
0
Kirillxskynet
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 4
06.03.2013, 11:11  [ТС] #3
К сожалению это решение не работает, все равно программа падает в том же месте.
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
06.03.2013, 12:02 #4
Kirillxskynet, у меня ничего не падает ни с компилятором от visual studio 2012, ни с gcc
можно код, приводящий к падению?
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
06.03.2013, 12:45 #5
Kirillxskynet, старина, вот в чем проблема, смари:

ты пытаешься обратиться для записи к valarray в составе pair. НО у тебя не выделена память для твоих valarray'ев. Например, если я сделаю такую затычку в конструкторе твоем:
C++
1
2
3
4
5
Wine::Wine(int y) : yr(y) 
{
    first.resize(10);
    second.resize(10);
}
То с 10 элементами можно работать. Т.е. ты должен где-то нужным числом выделять память.

Добавлено через 5 минут
И такая абракадабра:
C++
1
std::cin >> ((PairArray&) (*this)).second[i];
Не нужна.

Проще:
C++
1
std::cin >> second[i];
У тебя же наследование
0
Kirillxskynet
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 4
06.03.2013, 14:21  [ТС] #6
Благодарю ребята! Теперь все ясно, надо было в конструкторе массивы инициализировать.
0
06.03.2013, 14:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2013, 14:21
Привет! Вот еще темы с ответами:

Доступ к закрытым членам базового класса - C++
помогите понять что я не так сделал ? #include &lt;iostream&gt; using namespace std; class A { int PrA1; public: int...

Наследование классов. Доступ к данным базового класса - C++
Здравствуйте! Застрял на задачке... Суть самого задания: Создать класс Car (машина), который характеризуется торговой маркой (строка),...

Доступ к protected членам базового класса - C++
Здравствуйте, форумчане! Ниже приведенный код при компиляции вызывает следующую ошибку: error C2248: 'Element::AddTo' : cannot access...

Доступ к данным при наследовании - C++
здравствуйте, есть иерархия классов, схематично можно представить так: namespace Singl { class CObs {}; template&lt;typename T&gt; ...


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

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

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