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

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

Восстановить пароль Регистрация
 
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
25.10.2011, 14:30     Работа с классами. Нужна помощь с функцией #1
Всем добрый вечер! Вот задание:

Разработать класс содержащий:
- компоненты данные
- методы:
а) конструктор по умолчанию;
б) конструктор с параметрами;
в) конструктор копирования;
г) деструктор;
д) методы класса для работы с данными.
Данные класса должны иметь атрибут 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///
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
25.10.2011, 15:05     Работа с классами. Нужна помощь с функцией #2
Цитата Сообщение от Spotter Посмотреть сообщение
В результате выполнения программы в обоих объектах поменять первые слова строки.
Не совсем понятно, имеется в виду обменять первые n слов обеих строк местами?
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
25.10.2011, 20:03  [ТС]     Работа с классами. Нужна помощь с функцией #3
rangerx, Нет, одно слово. Первое слово одной строки поменять, и первое слово второй строки поменять. Я по крайне мере понял так задание.

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

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

Я думаю, что в вашем проекте класса не хватает одного члена, который задает длину символьного массива.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
25.10.2011, 20:15  [ТС]     Работа с классами. Нужна помощь с функцией #5
Сыроежка, На счёт деления конструкторов, это вопросы увы не ко мне, такое дали задание )) По существу, на счёт этой функции можете что-то сказать?
Сыроежка
Заблокирован
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;
};
и в этой функции проделать всю работу.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
26.10.2011, 20:22  [ТС]     Работа с классами. Нужна помощь с функцией #7
Сыроежка, Спасибо, сто вы имелли ввиду - я примерно понял. Но реализовать это думаю не получится, именно с чем-то подобным не сталкивался(( Есть ещё варианты?

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

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

Добавлено через 3 часа 53 минуты
UP///
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
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);
}
Сыроежка
Заблокирован
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. Отсюда конфликт имен!
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
26.10.2011, 20:34     Работа с классами. Нужна помощь с функцией #10
Цитата Сообщение от Сыроежка Посмотреть сообщение
Дело в том,что в исходном коде включен заголовок <string> да к тому же указана директива using namespace std:,и в то же самое время класс пользователя также назван string. Отсюда конфликт имен!
Спасибо кэп!
Я прежде всего к ТС обращался по причине того, что его код имеет ошибки.
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();
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
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);
Однако тут будет утечка памяти, ибо деструктор вы не вызываете.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
27.10.2011, 01:11  [ТС]     Работа с классами. Нужна помощь с функцией #13
Chelioss, "Что такое firststring?" - спрашивает вас компилятор.

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

Ладно, спать пора.
У вас прототип
C++
1
void setrow(char *);
а заголовок:
C++
1
void row::setrow()
Нужно исправить на:
C++
1
void row::setrow( char *firststring )
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
27.10.2011, 14:32  [ТС]     Работа с классами. Нужна помощь с функцией #15
Chelioss, Исправил, одна ошибка при компилировании осталась. На счёт функции нужной помогите пожалуйста.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
27.10.2011, 14:44     Работа с классами. Нужна помощь с функцией #16
Цитата Сообщение от Spotter Посмотреть сообщение
На счёт функции нужной помогите пожалуйста.
Где твои наработки, что не получается?
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
27.10.2011, 17:25  [ТС]     Работа с классами. Нужна помощь с функцией #17
rangerx, Наработок именно этой функции нет, поэтому и обратился за помощью.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
29.10.2011, 16:10  [ТС]     Работа с классами. Нужна помощь с функцией #18
UP///
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 19:16     Работа с классами. Нужна помощь с функцией
Еще ссылки по теме:

Нужна программа с классами C++
Работа с классами C++
Работа с классами C++

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

Или воспользуйтесь поиском по форуму:
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
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;
}
Yandex
Объявления
29.10.2011, 19:16     Работа с классами. Нужна помощь с функцией
Ответ Создать тему
Опции темы

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