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

Инкапсулировать без серьезного изменения..возможно ли? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.89
124bit
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 17
07.02.2011, 22:15     Инкапсулировать без серьезного изменения..возможно ли? #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
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
 
 
class list_block
{
    private:
 
        string data;
    public:
        list_block* next;
 
        string get_data() const {return data;}
        void set_data(string new_data){data=new_data;}
        void set_next(list_block* new_next) {next=new_next;}
 
        list_block(list_block* new_next) {set_next(new_next);}
};
 
 
class circle_list
{
    protected:
        list_block* first;
        list_block* second;
 
 
    public:
        circle_list();
        circle_list(string* strings, int n);
        circle_list(circle_list& list);
        ~circle_list();
 
        int size() const;
        void show() const;
        void push(string);  // chtob realizovat
                            //konstruktor s parametrom
                            //prishlos zasunut' push suda
};
 
 
 
 
 
 
circle_list::circle_list()
{
 
    first=new list_block(NULL);
    first->set_data("start");
    second=new list_block(first);
    second->set_data("end");
 
    first->set_next(second);
}
 
circle_list::circle_list(string* strings, int n)
{
    first=new list_block(NULL);
    first->set_data("start");
    second=new list_block(first);
    second->set_data("end");
 
    first->set_next(second);
    for (int i=0;i<n;i++) push(*(strings+i));
}
 
circle_list::circle_list(circle_list& list)
{
    first=new list_block(NULL);
    first->set_data("start");
    second=new list_block(first);
    second->set_data("end");
 
    first->set_next(second);
 
    list_block* block=list.first;
    int size=list.size()+2;
 
    for (int i=0;i<size-2;i++) block=block->next;
 
    while (block->get_data()!="start")
    {
        push(block->get_data());
        for (int i=0;i<size-1;i++) {block=block->next;}
    }
}
 
circle_list::~circle_list()
{
    list_block* block=first;
    list_block* block1=first;
    while (block->get_data()!="end")
    {
        block1=block->next;
        delete block;
        block=block1;
    }
    delete block;
    block=NULL;
    block1=NULL;
}
 
int circle_list::size() const
{
    list_block* block=first;
    if (block->next->get_data()=="end") return 0;
    int i=0;
 
    do
    {
        i=i+1;
        block=block->next;
    }
    while (block->next->get_data()!="end");
    return i;
}
 
void circle_list::show() const
{
    list_block* block=first->next;
    cout <<"Elementi:"<<endl;
    while (block->get_data()!="end")
    {
        cout << block->get_data() << endl;
        block=block->next;
    }
}
 
void circle_list::push(string st)
{
    list_block* new_block=new list_block(second);
    new_block->set_data(st);
    second=new_block;
    first->set_next(new_block);
}
 
 
 
 
 
class quene : public circle_list
{
    public:
        quene():circle_list(){};
        quene(string* strings, int n):circle_list(strings,n){};
        quene(quene& list):circle_list(list){};
 
        string deleter();
 
        void deleter(int n) {for (int i=0;i<n;i++) deleter();}
        void deleter_all() {deleter(size());}
        string push_pop(string st){push(st); return deleter();}
 
 
};
 
string quene::deleter()
{
    list_block* block=first;
    while (block->next->get_data()!="end")
        {
            block=block->next;
        }
    list_block* old_next=block->next;
    string res=block->get_data();
    block->next=block->next->next;
    block->set_data("end");
    delete old_next;
    return res;
}
 
int main()
{
    string str[3]={"Inna","Masha","Julja"};
    quene VASA(str,3);
    cout << "...sozdaem klass VASA s devchenkami *Julja*,*Masha*,*Inna*"<< endl;
    VASA.show();
    cout << endl;
    getchar();
 //----
    quene VASA1(VASA);
    cout << "...sozdaem klass VASA_1 kotorij bliznec VASA i kortorij sebe skopiroval devchenok"<< endl;
    VASA1.show();
    cout << endl;
    getchar();
 //----
    cout << "__teper VASJU brosila " << VASA.push_pop("Julja")<<". Potomu chto on mudak!"
 
            <<" Zato Julja za kanikuli potolstela i teper za dvoih"<< endl;
    VASA.show();
    cout << endl;
    getchar();
  //----
    cout << "i u VASi_1 stalo bloshe devchonok chem u VASI.";
    VASA1.show();
    cout << endl;
    getchar();
  //----
    cout << "I chtob bilo chesno, VASJU_1 tozhe brosit " << VASA1.push_pop("Julja")<< endl;
    VASA1.show();
    cout << endl;
    getchar();
  //----
    string str1[0]={};
    quene Julik;
    cout << "...no tut pojavilsja Julik..holostjak"<< endl;
    Julik.show();
    cout << endl;
    getchar();
  //----
    cout << "__i Innochka stala s Julikom"<< endl;
    Julik.push("Innochka");
    Julik.show();
    cout << endl;
    getchar();
   //----
    cout << "..no potom vdrug ona ego brosila (("<< endl;
    Julik.deleter();
    Julik.show();
    cout << endl;
    getchar();
    //----
    cout << "__a potom opjat' vernulas'"<< endl;
    Julik.push("Innochka");
    Julik.show();
    cout << endl;
    getchar();
   //----
    cout << "..no potom opjat', zaraza, brosila (("
            << endl << "I Julik ostalsja sovsem odin" << endl;
    Julik.deleter_all();
    Julik.show();
    cout << endl;
    getchar();
   //----
    cout << "VIVOD PR2:  INNOCHKA BALBES!!!!"<< endl;
    system("pause");
    return 0;
}

собственно это кольцевая очередь, на которой у меня построено уже 4 след лабы.Пошел сегодня сдавать - препод ткнул рукой в не инкапсулированный
public:
list_block* next;
из
class list_block в самом начале. И говорит, пока не перепишешь все так, чтоб он был в привате - не приму. А там куча операций присваивания и считывания через (->) из class circle_list и его сына quene.
Причем фрэнды использовать запретила. НА все мои возражения только кивает *овца((
Во общем, как малой кровью вбахать эту глупость в приват и иметь к ней нормальный доступ отовсюду? что не переписывать еще 5 таких лаб в хз скольких меcтах ?..
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2011, 22:15     Инкапсулировать без серьезного изменения..возможно ли?
Посмотрите здесь:

возможно ли прочитать текстовый файл сначала еще раз без закрытия? C++
Отрицательные элементы отмеченных строк матрицы заменить на -1, положительные на 1, а 0 оставит без изменения C++
C++ Сортировка (все отрицательные компоненты заменить их квадратами, оставив другие без изменения...)
Поменять местами первый элемент массива с максимальным, другой с минимальным, остальное оставить без изменения C++
Возможно, ли создать какой либо массив без определение его типа? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,698
08.02.2011, 03:47     Инкапсулировать без серьезного изменения..возможно ли? #21
Цитата Сообщение от volovzi Посмотреть сообщение
и в чём же разница между структурой и классом, кроме спецификаторов по-умолчанию?
В C++ существует такое понятие как POD-класс, что по сути означает Си-совместимую структуру, которая аналогична понятию записи в других языках. В таких структурах все данные сишных типов, и они открыты.
POD-объект может быть инициализирован с помощью агрегатного инициализатора (в фигурных скобках). Локальный POD-объект без инициализатора имеет неопределенное значение. При инициализации пустым инициализатором данные получают значение 0 или false.
В инструкции goto можно обходить объявления POD-объектов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
08.02.2011, 12:26     Инкапсулировать без серьезного изменения..возможно ли? #22
Mr.X, за информацию спасибо, но к теме это не относится. Мы тут рассматриваем всё же не POD, а сиплюсплюсные классы.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,698
08.02.2011, 12:48     Инкапсулировать без серьезного изменения..возможно ли? #23
Цитата Сообщение от volovzi Посмотреть сообщение
Mr.X, за информацию спасибо, но к теме это не относится. Мы тут рассматриваем всё же не POD, а сиплюсплюсные классы.
Я это к разговору об открытых данных классов. Согласно концепциям C++ они допустимы только в POD-классах, в других же - это дурной тон.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
08.02.2011, 13:31     Инкапсулировать без серьезного изменения..возможно ли? #24
Цитата Сообщение от Mr.X Посмотреть сообщение
Я это к разговору об открытых данных классов. Согласно концепциям C++ они допустимы только в POD-классах, в других же - это дурной тон.
Обоснуй. И прокомментируй это утверждение на примере класса std::pair или на примере исходников класса std::list.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,698
08.02.2011, 14:18     Инкапсулировать без серьезного изменения..возможно ли? #25
Цитата Сообщение от volovzi Посмотреть сообщение
Обоснуй. И прокомментируй это утверждение на примере класса std::pair или на примере исходников класса std::list.
А чего тут обосновывать? Инкапсуляция – это один из основополагающих принципов ООП.
Что касается шаблона класса std::pair, то это классический пример аналога паскалевской записи.
Класс же std::list слишком сложен, чтобы его здесь обсуждать, да и обобщенное программирование – это совсем отдельная песня.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
08.02.2011, 21:16     Инкапсулировать без серьезного изменения..возможно ли? #26
Цитата Сообщение от Mr.X Посмотреть сообщение
А чего тут обосновывать?
Утверждение обосновывать.
Либо признать, что ляпнул не подумав. Тем более, что я уже привёл контрпример, его опровергающий.

Что касается шаблона класса std::pair, то это классический пример аналога паскалевской записи.
И что это означает?

Класс же std::list слишком сложен, чтобы его здесь обсуждать
А ты в него хотя бы заглядывал?
Вот определение основы узла списка из исходников СБШ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct _List_node_base
  {
    _List_node_base* _M_next;   ///< Self-explanatory
    _List_node_base* _M_prev;   ///< Self-explanatory
 
    static void
    swap(_List_node_base& __x, _List_node_base& __y);
 
    void
    transfer(_List_node_base * const __first,
         _List_node_base * const __last);
 
    void
    reverse();
 
    void
    hook(_List_node_base * const __position);
 
    void
    unhook();
  };
Ничего сложного, и шаблонов здесь нет. Прокомментируй этот код.

...да и обобщенное программирование – это совсем отдельная песня.
С этого места поподробнее, пожалуйста. Я очень хотел бы узнать, чем отличается использование спецификаторов доступа в обобщённом и "обычном" программированиях.
124bit
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 17
08.02.2011, 23:11  [ТС]     Инкапсулировать без серьезного изменения..возможно ли? #27
VOLOVZI
так если я инкапсулирую подклас это ничего не изменит.. те же грабли, только она мне заявит, что подкласс некорректен



есть какие-нибудь другие легальные методы влезть в приват?
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,121
Записей в блоге: 3
08.02.2011, 23:34     Инкапсулировать без серьезного изменения..возможно ли? #28
Если так критично поставить указатель в приват, то сделайте так и заведите паблик функцию выдающую этот указатель
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
09.02.2011, 00:45     Инкапсулировать без серьезного изменения..возможно ли? #29
124bit, не понял, что не изменит? Какие грабли? Я тут, блин, на три страницы распинаюсь в попытке объяснить суть.
И разберись уже с термином «инкапсуляция». Модификатор доступа private и инкапсуляция — это совершенно разные вещи.
124bit
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 17
09.02.2011, 08:35  [ТС]     Инкапсулировать без серьезного изменения..возможно ли? #30
Predator_2004
Так черт... это ж не весь код. У меня еще 5 лаб на этой основе. Мне кода огогого придется менять, если я ввиду функции записи и считывания. Задача как раз чтоб решить вопрос малой кровью-малыми изменениями
VOLOVZI я тебя понимаю, и с абсолютно с тобой согласен.
Но учитывая специфику ситуации(препода!) задача стоит не *сделать норм программу*, а *переделать программу выше так, чтоб тот указатель стоял в привате*. При ввведении подкласса, у меня сам класс выходит корректен, с точки зрения препода, а подкласс некорректен. Вот. Причем вариант *что-то объяснить* не канает
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,121
Записей в блоге: 3
09.02.2011, 09:00     Инкапсулировать без серьезного изменения..возможно ли? #31
Попробуйте так тогда: указатель в приват, в вашем классе list_block пропишите все классы со спецификатором friend, обращающиеся к этому указателю. Это по-моему минимум изменений. А вообще почитайте http://cppforeach.wordpress.com/2008...ess_modifiers/ например и выберите оптимальный для себя вариант.
Josefina
 Аватар для Josefina
10 / 10 / 1
Регистрация: 27.09.2010
Сообщений: 32
09.02.2011, 12:34     Инкапсулировать без серьезного изменения..возможно ли? #32
Всю программу не смотрела, возможно решить проблему можно при помощи accessors и mutators методов, что это такое, как и почему именно их нужно использовать подробно рассказывает google.

В кратце напишу суть: это методы get и set для каждой переменной класса, значение которой необходимо менять извне.

Например, есть некоторый класс:

C++
1
2
3
4
5
6
class SomeClass
{
 private:
int some_index1;
int some_index2;
};
для того, чтобы менять значение этих переменных извне пишешь следующие методы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class SomeClass
{
 public:
int GetSomeIndex1() {return some_index1;}
int GetSomeIndex2() {return some_index2;}
void SetSomeIndex1(int new_index) {some_index1 = new_index;}
void SetSomeIndex2(int new_index) {some_index2 = new_index;}
 
 private:
int some_index1;
int some_index2;
};
далее, все прямые обращения к переменной класса нужно будет заменить за вызов соответствующего метода)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.02.2011, 13:23     Инкапсулировать без серьезного изменения..возможно ли? #33
Цитата Сообщение от 124bit Посмотреть сообщение
Мне кода огогого придется менять, если я ввиду функции записи и считывания
"Огого сколько кода менять" говорит об изначально неверном проектировании класса, о чём, судя по всему, вам и говорит преподаватель. Если бы класс был изначально верно спроектирован, вам пришлось бы менять только один класс, именно тот, что требует изменений.
124bit
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 17
09.02.2011, 16:52  [ТС]     Инкапсулировать без серьезного изменения..возможно ли? #34
всем конечно спасибо, за то что стараетесь помочь, но последние три ответа это даже не *фэйспалм*, это *фейсбук* какой-то(((
Predator_2004 ФРЭНДЫ ИСПОЛЬЗОВАТЬ МНЕ ЗАПРЕТИЛИ
silent1991 Класс спроэктирован правильно, просто есть куча других классов которые его используют, не так как хочет перпод, а напрямую. И я таки считаю, что инкапсуляцию я выполняю верно, в данном конкретном случае для указателя некст она не требуется. Препод так не считает.
Josefina черт(( да йомайо.. это писец скоко переписывать. Вся ж соль в том, чтоб не юзать эти мутаторы и аксессоры в данном случае, но лезть при этом в приват
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,121
Записей в блоге: 3
09.02.2011, 18:51     Инкапсулировать без серьезного изменения..возможно ли? #35
Каково назначение класса listblock по-вашему? Приведите пожалуйста условие.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.02.2011, 20:01     Инкапсулировать без серьезного изменения..возможно ли? #36
Цитата Сообщение от 124bit Посмотреть сообщение
Класс спроэктирован правильно
Вы сами косвенно утверждаете обратное. Каждый класс (правильно спроектированный) должен представлять собой абсолютно самостоятельный элемент. Если другие классы основываются на данном, да пожалуйста. Просто при правильном проектировании класса любое изменение в пределах этого класса абсолютно никак на остальных классах отражаться не должно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.02.2011, 20:04     Инкапсулировать без серьезного изменения..возможно ли? #37
124bit, Неверно спроектирован класс. Не надоело спорить со всем форумом? Если вы 3наете лучше всех, как должно быть, то зачем вы просите совета, как это переделать?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
09.02.2011, 20:15     Инкапсулировать без серьезного изменения..возможно ли? #38
Цитата Сообщение от 124bit Посмотреть сообщение
silent1991 Класс спроэктирован правильно...
Правильно спроектированный класс должен предоставлять некоторый интерфейс, с которым будут общаться другие объекты из "внешнего мира". Изменение внутренней реализации не должно затрагивать этот интерфейс. У тебя это условие не выполняется, и именно в этом весь корень твоих проблем.
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,121
Записей в блоге: 3
09.02.2011, 23:19     Инкапсулировать без серьезного изменения..возможно ли? #39
Короче говоря слушайте что вам говорит преподаватель. В контексте поставленных требований переделывать придется достаточно. Я бы рекомендовал переделать все. Теперь немного лирики: вам не зря препод толдычет про этот указатель. В данном случае он обязан быть в секции private. Почему? На это две причины. Первая: так называемая "культура программирования", которая прививается определенной группой преподавателей студентам с переменным успехом. Суть в том, (яркий пример - всевозможные списки) чтобы к указателю обращались только две функции, а именно на чтение/запись упрощает читабельность кода во многих случаях. Существенно. Из данного непосредственно следует вторая причина: отлов ошибок при работе. Согласитесь гораздо проще отыскать в работе с указателем баг когда с ним работает только две функции. А когда кода ~250 строк, такой отлов превращается в ночной кошмар (особенно если сбой в адресации - не факт что за час узнаешь в каком классе баг). В общем доводы приведены, и цитируя многих "учите матчасть", желаю успеха в нелегком труде!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2011, 01:50     Инкапсулировать без серьезного изменения..возможно ли?
Еще ссылки по теме:

Какие есть компиляторы c++ без изменения синтаксиса C++
C++ Можно ли добавлять данные в файл, без изменения прежних данных в этом файле?
Удалить из одномерного массива все четные элементы без изменения порядка C++

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

Или воспользуйтесь поиском по форуму:
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.02.2011, 01:50     Инкапсулировать без серьезного изменения..возможно ли? #40
Слыште, специалисты, на мои вопросы кто-нибудь ответит, или продолжите пустую болтовню?
Yandex
Объявления
10.02.2011, 01:50     Инкапсулировать без серьезного изменения..возможно ли?
Закрытая тема Создать тему
Опции темы

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