Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
#1

Работа с классами. Нужна помощь с функцией - C++

25.10.2011, 14:30. Просмотров 1085. Ответов 18
Метки нет (Все метки)

Всем добрый вечер! Вот задание:

Разработать класс содержащий:
- компоненты данные
- методы:
а) конструктор по умолчанию;
б) конструктор с параметрами;
в) конструктор копирования;
г) деструктор;
д) методы класса для работы с данными.
Данные класса должны иметь атрибут private.

Создать 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
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
 
#define MAX_LEN 256
 
class string {
public:
    string();
    string(char *);
    string(string const&);
 
    void setstring(char *);
    void change();
    void stringprint();
 
    ~string();
private:
    char *str;
};
 
string::string()
: str(NULL) {} 
 
string::string(char *firststring)
{
    str = new char [strlen(firststring) + 1];
    strcpy(str, firststring);
}
 
string::string(string const& existingObj)
{
    str = new char [strlen(existingObj.str) +1];
    strcpy(str, exsistingObj.str);
}
 
 
void string::setstring()
{
    str = new char [strlen(firststring) + 1];
    strcpy(str, firststring);
}
 
void string::change()
{
}
 
void stringprint()
{
    if(str)
        cout<<"  "<<str<<endl;
    else
        cout<<"  String is empty!\n";
}
 
string::~string()
{
    if(str)
        delete [] str;
}
 
int main()
{
    string obj1;
    char bufer [MAX_LEN], *str = "I'm Yura student!";
    string obj2(str);
 
    cout<<"\n\nObject_1. Enter string:\n\n    ";
    cin.getline(bufer, MAX_LEN);
    obj1.setstring(bufer);
 
 
    cout<<"\n\nObject_1 first:\n  ";
    obj1.stringprint();
    cout<<"\n\nObject_2 first:\n  ";
    obj2.stringprint();
 
    obj1.change();
    obj2.change();
 
    cout<<"\n\nObject_1 after:\n  ";
    obj1.stringprint();
    cout<<"\n\nObject_2 after:\n  ";
    obj2.stringprint();
    getch();
}
Добавлено через 50 минут
UP///

Добавлено через 14 часов 9 минут
UP///
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2011, 14:30
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с классами. Нужна помощь с функцией (C++):

Нужна программа с классами
Здравствуйте. Нужна программа с классами, и пояснением что она делает.....

работа с классами
помогите пожалуйста написать программу на C++: Создать класс Complex для...

Работа с классами
Помогите плз Определите значение переменных а, х, с после выполнения...

Работа с классами
Добрый день, на днях наткнулся на одну статью про работу с классами и не...

Работа с классами
Почему может вывестись здесь ошибка? #include &lt;iostream&gt; #include &lt;stdlib.h&gt;...

Работа с классами
плиз помогите решить нужно написать функции которыи будут выполнять сложение,...

18
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
25.10.2011, 15:05 #2
Цитата Сообщение от Spotter Посмотреть сообщение
В результате выполнения программы в обоих объектах поменять первые слова строки.
Не совсем понятно, имеется в виду обменять первые n слов обеих строк местами?
0
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
25.10.2011, 20:03  [ТС] #3
rangerx, Нет, одно слово. Первое слово одной строки поменять, и первое слово второй строки поменять. Я по крайне мере понял так задание.

Добавлено через 1 час 30 минут
up///

Добавлено через 3 часа 20 минут
UP///
0
Сыроежка
Заблокирован
25.10.2011, 20:09 #4
Между прочим конструктор по умолчанию может иметь параметры! Так что деление в вашем задание конструкторов на конструктор по умолчанию и конструктор с параметрами не совсем корректное.

Я думаю, что в вашем проекте класса не хватает одного члена, который задает длину символьного массива.
0
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
25.10.2011, 20:15  [ТС] #5
Сыроежка, На счёт деления конструкторов, это вопросы увы не ко мне, такое дали задание )) По существу, на счёт этой функции можете что-то сказать?
0
Сыроежка
Заблокирован
25.10.2011, 20:25 #6
Цитата Сообщение от Spotter Посмотреть сообщение
Сыроежка, На счёт деления конструкторов, это вопросы увы не ко мне, такое дали задание )) По существу, на счёт этой функции можете что-то сказать?
С помощью стандартной функции strtok ( если я ее правильно называю ) находите в каждой строке первые слова. Вычисляете их длину. Затем смотрите, достаточно ли у вас места в каждой объекте для сохранения слова из другого объекта. Если не достаточно, то заново выделяете память.

А затем копируете слово из одной строки в другую.

Дело в том, что я не знаю, что вы проходили по С++, а что нет. В вашем случае лучше всего эту функцию сделать дружественной классу.

Например,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class string {
public:
        string();
        string(char *);
        string(string const&);
 
        void setstring(char *);
        void change();
        void stringprint();
 
        ~string();
        friend swap_first_word( string &lhs, string &rhs );
private:
        char *str;
};
и в этой функции проделать всю работу.
1
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
26.10.2011, 20:22  [ТС] #7
Сыроежка, Спасибо, сто вы имелли ввиду - я примерно понял. Но реализовать это думаю не получится, именно с чем-то подобным не сталкивался(( Есть ещё варианты?

Добавлено через 1 час 50 минут
UP///

Добавлено через 16 часов 53 минуты
UP///

Добавлено через 3 часа 53 минуты
UP///
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
26.10.2011, 20:30 #8
У меня этот код вообще не работает на Visual Studio 2008. Походу ТС не знает о существовании стандартного класса string. Хотя включил его в проект, да и еще написал using namespace std;
Гениально!

Добавлено через 2 минуты
Отличный копипаст.
C++
1
2
3
4
5
void string::setstring()
{
        str = new char [strlen(firststring) + 1];
        strcpy(str, firststring);
}
0
Сыроежка
Заблокирован
26.10.2011, 20:32 #9
Цитата Сообщение от Chelioss Посмотреть сообщение
У меня этот код вообще не работает на Visual Studio 2008. Походу ТС не знает о существовании стандартно класса string. Хотя включил его в проект, да и еще написал using namespace std;
Гениально!

Добавлено через 2 минуты
Что это такое?
C++
1
2
3
4
5
void string::setstring()
{
        str = new char [strlen(firststring) + 1];
        strcpy(str, firststring);
}
Дело в том,что в исходном коде включен заголовок <string> да к тому же указана директива using namespace std:,и в то же самое время класс пользователя также назван string. Отсюда конфликт имен!
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
26.10.2011, 20:34 #10
Цитата Сообщение от Сыроежка Посмотреть сообщение
Дело в том,что в исходном коде включен заголовок <string> да к тому же указана директива using namespace std:,и в то же самое время класс пользователя также назван string. Отсюда конфликт имен!
Спасибо кэп!
Я прежде всего к ТС обращался по причине того, что его код имеет ошибки.
0
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
27.10.2011, 00:32  [ТС] #11
Ошибку понял, исправил. Но вопрос на счёт функции остаётся открытым, при компилировании на исправленный код, студия выдаёт 4 ошибки.

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
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
 
#define MAX_LEN 256
 
class row {
public:
        row();
        row(char *);
        row(row const&);
 
        void setrow(char *);
        void change();
        void rowprint();
 
        ~row();
private:
        char *str;
};
 
row::row()
: str(NULL) {} 
 
row::row(char *firststring)
{
        str = new char [strlen(firststring) + 1];
        strcpy(str, firststring);
}
 
row::row(row const& existingObj)
{
        str = new char [strlen(existingObj.str) +1];
        strcpy(str, exsistingObj.str);
}
 
 
void row::setrow()
{
        str = new char [strlen(firststring) + 1];
        strcpy(str, firststring);
}
 
void row::change()
{
}
 
void rowprint()
{
        if(str)
                cout<<"  "<<str<<endl;
        else
                cout<<"  String is empty!\n";
}
 
row::~row()
{
        if(str)
                delete [] str;
}
 
int main()
{
        row obj1;
        char bufer [MAX_LEN], *str = "I'm Yura student!";
        row obj2(str);
 
        cout<<"\n\nObject_1. Enter string:\n\n    ";
        cin.getline(bufer, MAX_LEN);
        obj1.row(bufer);
 
 
        cout<<"\n\nObject_1 first:\n  ";
        obj1.rowprint();
        cout<<"\n\nObject_2 first:\n  ";
        obj2.rowprint();
 
        obj1.change();
        obj2.change();
 
        cout<<"\n\nObject_1 after:\n  ";
        obj1.rowprint();
        cout<<"\n\nObject_2 after:\n  ";
        obj2.rowprint();
        getch();
}
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
27.10.2011, 00:39 #12
Цитата Сообщение от Spotter Посмотреть сообщение
row::row(row const& existingObj)
{
str = new char [strlen(existingObj.str) +1];
strcpy(str, exsistingObj.str);
}
Разве не видно, что имена у вас разные?
exsistingObj и existingObj

C++
1
2
3
4
5
void row::setrow()
{
        str = new char [strlen(firststring) + 1];
        strcpy(str, firststring);
}
"Что такое firststring?" - спрашивает вас компилятор.
C++
1
 obj1.row(bufer);
Правильно так:
C++
1
 obj1.row::row(bufer);
Однако тут будет утечка памяти, ибо деструктор вы не вызываете.
0
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
27.10.2011, 01:11  [ТС] #13
Chelioss, "Что такое firststring?" - спрашивает вас компилятор.

Ошибок в это плане вроде компилятор не выдаёт. Исправил ошибку с "exsistingObj и existingObj". Помогите пожалуйста всё до ума довести.
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
27.10.2011, 01:48 #14
А вы можете ответить на вопрос, что такое firststring? Я знаю, что это набор символов, которые ничего не значат. Ни больше, ни меньше.

Ладно, спать пора.
У вас прототип
C++
1
void setrow(char *);
а заголовок:
C++
1
void row::setrow()
Нужно исправить на:
C++
1
void row::setrow( char *firststring )
0
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
27.10.2011, 14:32  [ТС] #15
Chelioss, Исправил, одна ошибка при компилировании осталась. На счёт функции нужной помогите пожалуйста.
0
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
27.10.2011, 14:44 #16
Цитата Сообщение от Spotter Посмотреть сообщение
На счёт функции нужной помогите пожалуйста.
Где твои наработки, что не получается?
0
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
27.10.2011, 17:25  [ТС] #17
rangerx, Наработок именно этой функции нет, поэтому и обратился за помощью.
0
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
29.10.2011, 16:10  [ТС] #18
UP///
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
29.10.2011, 19:16 #19
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
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
 
#define MAX_LEN 256
 
class row {
public:
    row();
    row(char *);
    row(row const&);
 
    void setrow(char *);
    void swap_first_word( row &second_string );
    void rowprint();
 
    ~row();
private:
    char *str;
    int size;
};
 
row::row()
: str(NULL), size( 0 ) {} 
 
row::row(char *firststring)
{   
    if( firststring )
    {
        size = strlen( firststring ) + 1;
        str = new char[ size ];
        strcpy( str, firststring );
    }
    else
    {
        str = NULL;
        size = 0;
    }
}
 
row::row(row const& exsistingObj)
: size( exsistingObj.size )
{
    if( size )
    {
        str = new char [ size ];
        strcpy( str, exsistingObj.str );
    }
    else
    {
        str = NULL;
        size = 0;
    }
 
}
 
 
void row::setrow( char *firststring )
{
    if( str )
        delete [] str;
    size = strlen( firststring ) + 1;
    str = new char [ size ];
    strcpy( str, firststring );
}
 
void row::swap_first_word( row &second_string )
{
    if( size || second_string.size )
    {
        char *new_first_string_ptr = new char[ size + second_string.size ]; // создаем строку для новой версии первой строки
        char *new_second_string_ptr = new char[ size + second_string.size ]; // создаем строку для новой версии второй строки
        char *new_first_ptr = new_first_string_ptr;
        char *new_second_ptr = new_second_string_ptr;
        *new_first_ptr = 0;
        *new_second_ptr = 0;
 
        char *second_ptr = NULL;
        for( second_ptr = second_string.str; *second_ptr == ' ' && *second_ptr != 0; ++second_ptr, ++new_second_ptr )
            *new_second_ptr = *second_ptr;  // копируем все пробелы из первой строки в новую версию первой строки
        char *first_ptr = NULL;
        for( first_ptr = str; *first_ptr == ' ' && *first_ptr != 0; ++first_ptr, ++new_first_ptr )
            *new_first_ptr = *first_ptr; // копируем все пробелы из второй строки в новую версию второй строки
        
        for( ; *second_ptr != ' ' && *second_ptr != 0; ++second_ptr, ++new_first_ptr )
            *new_first_ptr = *second_ptr; // добовляем в новую версию первой строки первое слово второй строки
        for( ; *first_ptr != ' ' && *first_ptr != 0; ++first_ptr, ++new_second_ptr )
            *new_second_ptr = *first_ptr; // добовляем в новую версию второй строки первое слово первой строки
 
        if( second_ptr )
            strcpy( new_first_ptr, first_ptr ); // оставшуюся часть первой строки добовляем в новую версию первой строки
        if( first_ptr )
            strcpy( new_second_ptr, second_ptr ); // оставшуюся часть второй строки добовляем в новую версию второй строки
 
        delete [] str;
        delete [] second_string.str;
 
        if( new_first_string_ptr != 0 ) 
        {
            size = strlen( new_first_string_ptr ) + 1;
            str = new char[ size ];
            strcpy( str, new_first_string_ptr );
        }
        else 
        {
            str = NULL;
            size = 0;
        }
        
        if( new_second_string_ptr != 0 )
        {
            second_string.size = strlen( new_second_string_ptr ) + 1;
            second_string.str = new char[ second_string.size ];
            strcpy( second_string.str, new_second_string_ptr );
        }
        else
        {
            str = NULL;
            size = 0;
        }
 
        delete [] new_first_string_ptr;
        delete [] new_second_string_ptr;
            
    }
}
 
void row::rowprint()
{
     if( str)
        cout<<"  "<<str<<endl;
     else
        cout<<"  String is empty!\n";
}
 
row::~row()
{
     if( size )
        delete [] str;
}
 
int main()
{
    row obj1;
    char bufer [MAX_LEN], *str = "I'm Yura student!";
    row obj2(str);
 
    cout<<"\n\nObject_1. Enter string:\n\n    ";
    cin.getline(bufer, MAX_LEN);
    obj1.setrow(bufer);
 
 
    cout<<"\n\nObject_1 first:\n  ";
    obj1.rowprint();
    cout<<"\n\nObject_2 first:\n  ";
    obj2.rowprint();
 
    obj1.swap_first_word(obj2);
 
    cout<<"\n\nObject_1 after:\n  ";
    obj1.rowprint();
    cout<<"\n\nObject_2 after:\n  ";
    obj2.rowprint();
    _getch();
    return 0;
}
1
29.10.2011, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 19:16
Привет! Вот еще темы с решениями:

Работа с классами
Здравствуйте. Есть код, компиляция происходит нормально, Dev-C++ не выдаёт...

Работа с классами
Помогите пожалуйста с заданием Создать базовый класс Человек. Каждый объект...

Работа с классами
Привет всем!!!!! Пацаны помогите написать программу плиз, на завтро нужно!!!!!...

Работа С Классами
Привет Всем , Перехожу С делфи ))) Вот никак не пойму Вот Эту хрень в нутри...


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

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

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