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

флаг заполнения масива через перегрузку - C++

Восстановить пароль Регистрация
 
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
17.04.2013, 19:30     флаг заполнения масива через перегрузку #1
подскажите пожалуйста, у меня есть два класа базовый и производный и в том и вот у меня есть метод заполнения масива и есть задания, надо через перегрузку реализовать флаг (bool) заполнения массива 1 если заполнено и 0 если нет, что имено я немогу понять так ето то как ето реализовать через перегрузку, ета переменая по моему заданию должна находится в производном класе, но я не как немогу понять как метод заполнения масива должен о ней узнать, тоесть когда я у себя в основной програме делаю вызов заполнения из базового класа, оно его заполняет но переменая не меняет своего значения и у меня пишет что "масив до сих пор не заполнен" а если вызвать из производного класа то все прекрасно работает значения переменой меняется и дальше все как надо
подскажите пожалуйста, может хоть примерчик небольшой какой нибуть или на словах, а там я уже разберусь надеюсь, просто немогу понять как базовый клас должен узнать о переменой из производного или вопще как реализуется ето через перегрузку

Добавлено через 3 часа 28 минут
тема актуальна
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.04.2013, 11:42     флаг заполнения масива через перегрузку #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
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
#include <iostream>
#include <stdexcept>
 
class ArrayIsFilledException : public std::exception
{
};
 
class IntArray
{
public:
    IntArray(int capacity):
        m_size(0),
        m_capacity(capacity),
        m_array(new int[capacity])
    {
    }
    
    virtual ~IntArray()
    {
        delete[] m_array;
    }
    
    int size() const
    {
        return m_size;
    }
    
    int capacity() const
    {
        return m_capacity;
    }
    
    virtual void push_back(int value)
    {
        if (size() == capacity())
            throw ArrayIsFilledException();
        
        m_size += 1;
        m_array[size() - 1] = value;
    }
    
    int& operator[](int index)
    {
        if (!(0 <= index && index < size()))
            throw std::out_of_range("IntArray out of range");
        
        return m_array[index];
    }
    
    const int& operator[](int index) const
    {
        if (!(0 <= index && index < size()))
            throw std::out_of_range("IntArray out of range");
        
        return m_array[index];
    }
    
private:
    int m_size;
    int m_capacity;
    int *m_array;
};
 
class IntArrayWithFillFlag : public IntArray
{
public:
    IntArrayWithFillFlag(int capacity):
        IntArray(capacity),
        m_filled_flag(false)
    {
    }
    
    bool is_filled() const
    {
        return m_filled_flag;
    }
    
    virtual void push_back(int value)
    {
        try
        {
            IntArray::push_back(value);
        }
        catch (const ArrayIsFilledException&)
        {
            m_filled_flag = true;
        }
    }
    
private:
    bool m_filled_flag;
};
 
int main()
{
    IntArrayWithFillFlag arr(10);
    
    for (int i = 0; i < arr.capacity() + 5; ++i)
    {
        arr.push_back(i);
        std::cout << std::boolalpha << arr.is_filled() << std::endl;
    }
    
    for (int i = 0; i < arr.size(); ++i)
        std::cout << arr[i] << "  ";
    std::cout << std::endl;
    
    return 0;
}
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
22.04.2013, 19:38  [ТС]     флаг заполнения масива через перегрузку #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
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
#include <iostream> 
#include <algorithm>  
#include <functional>
#include <vector>                                                                
using namespace std;                                                           
class CCube                                                                               
{
public :                                                                                    
    CCube ():x(4),y(4),z(5)                                       
    {}                            
    ~CCube()                                                                  
    {}
    void FillCube ();
    int x,y,z;
    int Mas[4][4][5];
};
class CSecond: public CCube
{
    int mas[80];
public:
    CSecond():flag(0)
    {}
    ~CSecond ()
    {}
    bool flag;
    void RandomShuffle(int x, int n);
    void Fill();
};
void CCube::FillCube ()
{ 
    for (int k = 0; k<z;k++)
    {
        for (int i = 0; i<x;i++)
        {
            for( int j =0;j<y;j++)
            {
                Mas[i][j][k]=i*z*y+j*z+k;
            }
        }
    }
    flag=1;
}
void CSecond::RandomShuffle( int a, int n)
{
    const int VECTOR_SIZE=80;
    typedef vector<int> IntVector;
    typedef IntVector::iterator IntVectorIt;
    int g=0;
    IntVector Numbers(VECTOR_SIZE); 
    IntVectorIt start,end, it;
    for (int i=0;i<80;i++)
    {
        Numbers[i] = a;
        a=a+n;
    }
    start=Numbers.begin();
    end=Numbers.end();
    random_shuffle(start, end);
    for(it=start; it!=end; it++)
    {
        mas[g]=*it;
        g++;
    }
}
void CSecond::Fill()
{
    int g=0;
    for ( i = 0; i<x;i++)                                   
    {
        for (int j = 0; j<y;j++)                    
        {
            for( int k =0;k<z;k++)
            {
                Mas[i][j][k]=mas[g];
                g++;
            }
            
        }
    }
    flag = 1;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.04.2013, 19:42     флаг заполнения масива через перегрузку #4
Этот код вообще некорректный. Базовый класс ничего не знает о том, что добавляют наследники, соответственно, из методов CCube никакой flag не доступен. Лучше скажите, что именно вам непонятно в моём коде, и я постараюсь это объяснить.
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
22.04.2013, 19:50  [ТС]     флаг заполнения масива через перегрузку #5
Я не вижу где идет переключения флага, при выборе заполнения через базовый клас, в какой строчке?
я вижу появление флага в классе IntArrayWithFillFlag, а как он связан с базовым класом?

Добавлено через 1 минуту
просто я вот седня говорил с преподователем, он говорит что через перегрузку можно розширить функциональность методов базового класса, вроде бы примерно такие слова были, но по его примерно несовсем могу разобратся как етого можно добится
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.04.2013, 19:54     флаг заполнения масива через перегрузку #6
итернал, никак.
Цитата Сообщение от итернал Посмотреть сообщение
ета переменая по моему заданию должна находится в производном класе
Всё, что находится в производном классе, базовому не доступно. У меня есть класс IntArray, в котором есть метод push_back, который просто добавляет элемент в конец массива, и производный от него класс IntArrayWithFillFlag, в котором переопределён метод push_back, устанавливающий флаг при заполнении массива. То, чего вы и хотели.

Добавлено через 2 минуты
Цитата Сообщение от итернал Посмотреть сообщение
он говорит что через перегрузку можно розширить функциональность методов базового класса
Через переопределение. Что у меня и сделано - push_back производного класса вызывает реализацию базового, но также устанавливает флаг в случае заполнения массива.
Yandex
Объявления
22.04.2013, 19:54     флаг заполнения масива через перегрузку
Ответ Создать тему
Опции темы

Текущее время: 13:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru