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

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

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

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

07.02.2011, 22:15. Просмотров 4702. Ответов 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тах ?..
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2011, 22:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инкапсулировать без серьезного изменения..возможно ли? (C++):

Какие есть компиляторы c++ без изменения синтаксиса - C++
какие есть компиляторы c++ без изменения синтаксиса?

Оставить без изменения последовательность, если она упорядочена - C++
Даны целые числа а1...аn, где n - целое положительное число (n&lt;=100). Оставить без изменения последовательность, если она упорядочена по...

Удалить дубликаты без изменения порядка следования элементов - C++
можно ли это сделать средствами stl эффективней? std::vector&lt;int&gt; vec = { 31,2, 4,4421,52,425,2,4,4,31,34,32,3,4,2,31,4421}; for(const...

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

Удалить из одномерного массива все четные элементы без изменения порядка - C++
Написать программу используя функции, но не использовать указатели 2. Удалить из одномерного массива все четные элементы, без изменения...

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

90
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
09.02.2011, 09:00 #31
Попробуйте так тогда: указатель в приват, в вашем классе list_block пропишите все классы со спецификатором friend, обращающиеся к этому указателю. Это по-моему минимум изменений. А вообще почитайте http://cppforeach.wordpress.com/2008/05/19/around_access_modifiers/ например и выберите оптимальный для себя вариант.
0
Josefina
11 / 11 / 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;
};
далее, все прямые обращения к переменной класса нужно будет заменить за вызов соответствующего метода)
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
09.02.2011, 13:23 #33
Цитата Сообщение от 124bit Посмотреть сообщение
Мне кода огогого придется менять, если я ввиду функции записи и считывания
"Огого сколько кода менять" говорит об изначально неверном проектировании класса, о чём, судя по всему, вам и говорит преподаватель. Если бы класс был изначально верно спроектирован, вам пришлось бы менять только один класс, именно тот, что требует изменений.
2
124bit
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 17
09.02.2011, 16:52  [ТС] #34
всем конечно спасибо, за то что стараетесь помочь, но последние три ответа это даже не *фэйспалм*, это *фейсбук* какой-то(((
Predator_2004 ФРЭНДЫ ИСПОЛЬЗОВАТЬ МНЕ ЗАПРЕТИЛИ
silent1991 Класс спроэктирован правильно, просто есть куча других классов которые его используют, не так как хочет перпод, а напрямую. И я таки считаю, что инкапсуляцию я выполняю верно, в данном конкретном случае для указателя некст она не требуется. Препод так не считает.
Josefina черт(( да йомайо.. это писец скоко переписывать. Вся ж соль в том, чтоб не юзать эти мутаторы и аксессоры в данном случае, но лезть при этом в приват
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
09.02.2011, 18:51 #35
Каково назначение класса listblock по-вашему? Приведите пожалуйста условие.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
09.02.2011, 20:01 #36
Цитата Сообщение от 124bit Посмотреть сообщение
Класс спроэктирован правильно
Вы сами косвенно утверждаете обратное. Каждый класс (правильно спроектированный) должен представлять собой абсолютно самостоятельный элемент. Если другие классы основываются на данном, да пожалуйста. Просто при правильном проектировании класса любое изменение в пределах этого класса абсолютно никак на остальных классах отражаться не должно.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.02.2011, 20:04 #37
124bit, Неверно спроектирован класс. Не надоело спорить со всем форумом? Если вы 3наете лучше всех, как должно быть, то зачем вы просите совета, как это переделать?
1
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.02.2011, 20:15 #38
Цитата Сообщение от 124bit Посмотреть сообщение
silent1991 Класс спроэктирован правильно...
Правильно спроектированный класс должен предоставлять некоторый интерфейс, с которым будут общаться другие объекты из "внешнего мира". Изменение внутренней реализации не должно затрагивать этот интерфейс. У тебя это условие не выполняется, и именно в этом весь корень твоих проблем.
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
09.02.2011, 23:19 #39
Короче говоря слушайте что вам говорит преподаватель. В контексте поставленных требований переделывать придется достаточно. Я бы рекомендовал переделать все. Теперь немного лирики: вам не зря препод толдычет про этот указатель. В данном случае он обязан быть в секции private. Почему? На это две причины. Первая: так называемая "культура программирования", которая прививается определенной группой преподавателей студентам с переменным успехом. Суть в том, (яркий пример - всевозможные списки) чтобы к указателю обращались только две функции, а именно на чтение/запись упрощает читабельность кода во многих случаях. Существенно. Из данного непосредственно следует вторая причина: отлов ошибок при работе. Согласитесь гораздо проще отыскать в работе с указателем баг когда с ним работает только две функции. А когда кода ~250 строк, такой отлов превращается в ночной кошмар (особенно если сбой в адресации - не факт что за час узнаешь в каком классе баг). В общем доводы приведены, и цитируя многих "учите матчасть", желаю успеха в нелегком труде!
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.02.2011, 01:50 #40
Слыште, специалисты, на мои вопросы кто-нибудь ответит, или продолжите пустую болтовню?
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.02.2011, 08:08 #41
Цитата Сообщение от volovzi Посмотреть сообщение
на мои вопросы кто-нибудь ответит
volovzi, на какие конкретно? Хоть одного внятного вопроса, я, например, не вижу.
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
10.02.2011, 09:45 #42

Не по теме:

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


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

 Комментарий модератора 
Прислушайтесь к совету, будьте вежливее.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
10.02.2011, 13:26 #44
volovzi, во-первых, повежливее. Не зарывайтесь.
Во-вторых, вам уже пятую страницу отвечают, что это плохой тон программирования. Класс должен содержать закрытые данные (шестерёнки) и открытые методы - рычаги. Нельзя позволять пользователю ковыряться в шестерёнках, а то мотор в лучшем случае заглохнет, в худшем - взорвётся.
0
[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;
}
0
10.02.2011, 13:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2011, 13:46
Привет! Вот еще темы с ответами:

Даны действительные числа a1.an , где n – натуральное число. Оставить без изменения последовательность a1 - C++
Даны действительные числа a1...an , где n – натуральное число. Оставить без изменения последовательность a1....an, если она упорядочена по...

Отрицательные элементы отмеченных строк матрицы заменить на -1, положительные на 1, а 0 оставит без изменения - C++
Даны натуральное число m, целые числа а1,..,аm и целочисленная квадратная матрица порядка m. Строку с номер i матрицы назовем отмеченной ,...

Сортировка (все отрицательные компоненты заменить их квадратами, оставив другие без изменения...) - C++
Если действительный вектор X (x1, x2, ..., xm) имеет хотя бы одну компоненту, которая меньше 2, то все отрицательные компоненты заменить их...

возможно ли прочитать текстовый файл сначала еще раз без закрытия? - C++
Добрый день!!! Подскажите пожалуйста, возможно ли прочитать текстовый файл еще раз сначала? Или чтобы начать чтение снова, надо его закрыть...


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

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

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