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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.89
124bit
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 17
#1

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

07.02.2011, 22:15. Просмотров 4504. Ответов 90
Метки нет (Все метки)

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++ Если введенный список упорядочен по возрастанию, то оставить его без изменения
возможно ли прочитать текстовый файл сначала еще раз без закрытия? C++
Отрицательные элементы отмеченных строк матрицы заменить на -1, положительные на 1, а 0 оставит без изменения C++
C++ Сортировка (все отрицательные компоненты заменить их квадратами, оставив другие без изменения...)
Поменять местами первый элемент массива с максимальным, другой с минимальным, остальное оставить без изменения C++
Возможно, ли создать какой либо массив без определение его типа? C++
Какие есть компиляторы c++ без изменения синтаксиса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.02.2011, 08:08     Инкапсулировать без серьезного изменения..возможно ли? #41
Цитата Сообщение от volovzi Посмотреть сообщение
на мои вопросы кто-нибудь ответит
volovzi, на какие конкретно? Хоть одного внятного вопроса, я, например, не вижу.
easybudda
Эксперт С++
9453 / 5466 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
10.02.2011, 09:45     Инкапсулировать без серьезного изменения..возможно ли? #42

Не по теме:

Цитата Сообщение от 124bit Посмотреть сообщение
Класс спроэктирован правильно, просто есть куча других классов которые его используют, не так как хочет перпод, а напрямую. И я таки считаю, что инкапсуляцию я выполняю верно
"... Да я и сам могу, но у меня правильнописание хромает. Оно хорошее, но почему-то хромает." (с) Винни Пух


Да поймите, это не "препод так хочет", это Вам говорят, как должно быть. Так, что, прийдётся Вам переписывать всю Вашу "кучу кода"...
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.02.2011, 12:50     Инкапсулировать без серьезного изменения..возможно ли? #43
CyBOSSeR, Я уже пятую страницу прошу, чтобы кто-нибудь из комментаторов объяснил, чем плохи открытые переменные.

 Комментарий модератора 
Прислушайтесь к совету, будьте вежливее.
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2011, 13:26     Инкапсулировать без серьезного изменения..возможно ли? #44
volovzi, во-первых, повежливее. Не зарывайтесь.
Во-вторых, вам уже пятую страницу отвечают, что это плохой тон программирования. Класс должен содержать закрытые данные (шестерёнки) и открытые методы - рычаги. Нельзя позволять пользователю ковыряться в шестерёнках, а то мотор в лучшем случае заглохнет, в худшем - взорвётся.
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
10.02.2011, 13:46     Инкапсулировать без серьезного изменения..возможно ли? #45
124bit, узко мыслите исправление вашего кода это рутинная операция, замена next на get_next()
стоит подумать об автоматизации этого процесса. Вот набросал код, везде где встретит ->next заменяет на ->get_next() :
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
#include <fstream>
#include <string>
#include <iostream>
 
#define TARGET "->next"
#define SAMPLE "->get_next()"
 
int main()
{
    std::ifstream fin("input.cpp");
    if(!fin)
    {
        std::cerr << "Cannot open file!\n";
        return 1;
    }
 
    std::ofstream fout("output.cpp");
    std::string buf;
 
    while( !fin.eof() )
    {
        std::getline(fin,buf);
        std::cout << buf << std::endl;
        if(buf.empty())
            continue;
 
        int offset=0;
 
        while( (offset = buf.find(TARGET)) != -1 )
        {
            buf.erase(offset, strlen(TARGET));
            buf.insert(offset,SAMPLE);
        }
 
        fout << buf << std::endl;
    }
    return 0;
}
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2011, 13:47     Инкапсулировать без серьезного изменения..возможно ли? #46
[Freeman], такой код за вас набросали разработчики любого более-менее приличного текстового редактора. Вызывается обычно по Ctrl+R.
[Freeman]
10.02.2011, 13:53
  #47

Не по теме:

У меня только блокнот
В блокноте это ctrl + H.

silent_1991
10.02.2011, 13:56
  #48

Не по теме:

[Freeman], в блокноте такая функция тоже имеется

volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.02.2011, 16:12     Инкапсулировать без серьезного изменения..возможно ли? #49
Цитата Сообщение от silent_1991 Посмотреть сообщение
volovzi, во-первых, повежливее. Не зарывайтесь.
Вежливее не получается, потому что вы все нагло игнорируете мои комментарии и продолжаете впаривать новичку ерунду.

Во-вторых, вам уже пятую страницу отвечают, что это плохой тон программирования.
И я уже пятую страницу это утверждение опровергаю. Смотри четыре поста, начиная вот с этого:
Инкапсулировать без серьезного изменения..возможно ли?

Класс должен содержать закрытые данные (шестерёнки) и открытые методы - рычаги.
Вот это «должен» я и прошу доказать. Если нет доказательства, то утверждение априори неверно.

Нельзя позволять пользователю ковыряться в шестерёнках, а то мотор в лучшем случае заглохнет, в худшем - взорвётся.
А к этому мы вернёмся позже, если ты сможешь ответить на предыдущие вопросы.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
10.02.2011, 16:58     Инкапсулировать без серьезного изменения..возможно ли? #50
а что доказывать, все что не нужно знать внешнему миру пихаем в черный ящик. Можно вообще все в паблике написать, тогда классы зачем?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 17:08     Инкапсулировать без серьезного изменения..возможно ли? #51
Сообщение было отмечено автором темы, экспертом или модератором как ответ
volovzi, тебе никто ничего не должен, пиши как знаешь
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2011, 18:18     Инкапсулировать без серьезного изменения..возможно ли? #52
volovzi, а то, что небо голубое, вам тоже доказать надо? Или то, что по руке топором бить не надо? Это просто так есть, это правильно, а значит надо делать так. Можно по-разному делать, но лучше делать правильно.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.02.2011, 23:16     Инкапсулировать без серьезного изменения..возможно ли? #53
Цитата Сообщение от alex_x_x Посмотреть сообщение
volovzi, тебе никто ничего не должен, пиши как знаешь
Цитата Сообщение от silent_1991 Посмотреть сообщение
volovzi, а то, что небо голубое, вам тоже доказать надо? Или то, что по руке топором бить не надо? Это просто так есть, это правильно, а значит надо делать так. Можно по-разному делать, но лучше делать правильно.
Собственно, что я и ожидал — доказать свою точку зрения вы не способны, поэтому выкручиваетесь как можете. Абсурд ситуации в том, что говоря об обязательном закрытии переменных класса вы ссылаетесь на авторитеты (СБШ) и какие-то законы природы (типа «это правильно»), но при этом у авторитетов-то, как раз, по-другому, а «закон природы» нигде никогда и никем не был сформулирован.

Таким образом вы противоречите сами себе, следовательно, ваши утверждения неверны.
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2011, 23:18     Инкапсулировать без серьезного изменения..возможно ли? #54
volovzi, странный вывод. Докажите обратное (что правильно делать так, как говорите вы).
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 23:22     Инкапсулировать без серьезного изменения..возможно ли? #55
volovzi, есть опыт и здравый, но эти категории неформализуемые

Цитата Сообщение от volovzi Посмотреть сообщение
Таким образом вы противоречите сами себе, следовательно, ваши утверждения неверны.
учите логику, логическое следование тащемта работает не так

и кстати, на govnokod.ru я уверен у вас найдется много единомышленников
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2011, 23:22     Инкапсулировать без серьезного изменения..возможно ли? #56
Вообще говоря, вы хотите, чтобы в классе были открыты некоторые жизненно важные для всего контейнера данные. Открыты для общего пользования! Это противоречит всем канонам ООП (данные не сокрыты - значит, любой желающий может всё поломать одним неверным движением). Что ещё доказывать - честно, я не знаю.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.02.2011, 23:33     Инкапсулировать без серьезного изменения..возможно ли? #57
silent_1991, это типичный «аргумент» религиозного спора: докажи, мол, что бога нет.
Доказывать должен тот, кто высказывает положительное утверждение о существовании, правильности и т.п. Я не делал никаких утверждений о правильности какого-либо метода, а только опроверг другое утверждение, поэтому не должен ничего доказывать.

Но если тебе интересно, то я утверждаю, что модификаторы доступа к переменным зависят от назначения и, если угодно, от сложности внутреннего устройства класса.
Если не нужно никак фильтровать значения или проводить дополнительные операции при изменении значений переменных, то не нужно плодить лишние сущности (сет-гет), а нужно просто сделать их открытыми. Как это сделано в классе «std::pair» или как это часто делается в узлах различных контейнеров (деревьев, списков и т.п.).

Добавлено через 3 минуты
Цитата Сообщение от alex_x_x Посмотреть сообщение
volovzi, есть опыт и здравый, но эти категории неформализуемые


учите логику, логическое следование тащемта работает не так

и кстати, на govnokod.ru я уверен у вас найдется много единомышленников
Здесь комментарии излишни, иди читай всё заново.

Цитата Сообщение от silent_1991 Посмотреть сообщение
Это противоречит всем канонам ООП.
Вот покажи мне эти каноны.
HighPredator
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,384
Записей в блоге: 3
10.02.2011, 23:34     Инкапсулировать без серьезного изменения..возможно ли? #58
volovzi, представьте себе следующее: у вас есть склад на котором хранят товары разные фирмы. Товары ставятся на места краном. Вы будете позволять водителям приезжающих от фирм грузовиков кататься на кране по вашему складу в поисках хорошего места? Или главбуху? Или охраннику? Нет. Это должен делать только оператор крана, т.к. у него соответствующая квалификация, а другие устроят армагеддон и денег вы не заработаете. Также и в ООП. И это не прихоть отдельных лиц, а здравый смысл.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.02.2011, 23:35     Инкапсулировать без серьезного изменения..возможно ли? #59
Predator_2004, прочитай предыдущее сообщение ещё раз.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2011, 23:37     Инкапсулировать без серьезного изменения..возможно ли?
Еще ссылки по теме:

C++ Можно ли добавлять данные в файл, без изменения прежних данных в этом файле?
Удалить из одномерного массива все четные элементы без изменения порядка C++
C++ Оставить без изменения последовательность, если она упорядочена
Удалить дубликаты без изменения порядка следования элементов C++
Даны действительные числа a1.an , где n – натуральное число. Оставить без изменения последовательность a1 C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2011, 23:37     Инкапсулировать без серьезного изменения..возможно ли? #60
Понятно, очередной Напильнег.
Yandex
Объявления
10.02.2011, 23:37     Инкапсулировать без серьезного изменения..возможно ли?
Закрытая тема Создать тему
Опции темы

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