Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
1

Выделить в памяти объект класса string и присвоить ему значение

17.07.2015, 09:00. Просмотров 971. Ответов 24
Метки нет (Все метки)

Здравствуйте!

Я доучился :-(
Дошел до полиморфизма и сдал проект и не знаю как работать с классом string.
Нужно в памяти выделить объект класса string и присвоить ему исходное значение "NoName".
Нижеприведенный код не работает...

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string *itsString;
    itsString=new string;
    *itsString="NoName";
}
Как сделать, чтобы заработал?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2015, 09:00
Ответы с готовыми решениями:

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод...

Найти значение максимального элемента динамического массива, присвоить ему значение 555
Создать двумерный динамический массив произвольного размера. Заполнить его случайным образом. Найти...

Массив char является полем класса: как присвоить ему значения?
Товарищи, столкнулся с проблемой. Изначально пишу программу для перегрузки операторов +,- и пр. . В...

Свойству класса присвоить объект другого класса
Добрый день форумчане. Подскажите, пожалуйста. Свойствам класса можно при описании присваивать...

24
6908 / 5973 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
17.07.2015, 09:11 2
Что именно не работает? Ошибку выдаёт или что?
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
17.07.2015, 09:36  [ТС] 3
Да. Кучу ошибок компиляции...

Добавлено через 5 минут
Я работаю под Сентос 7. Выдает следующее:

/tmp/ccjnWyQ1.o: In function `main':
stam.cpp:(.text+0x11): undefined reference to `operator new(unsigned long)'
stam.cpp:(.text+0x1c): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()'
stam.cpp:(.text+0x31): undefined reference to `std::string::operator=(char const*)'
stam.cpp:(.text+0x43): undefined reference to `operator delete(void*)'
/tmp/ccjnWyQ1.o: In function `__static_initialization_and_destruction_0(int, int)':
stam.cpp:(.text+0x7e): undefined reference to `std::ios_base::Init::Init()'
stam.cpp:(.text+0x8d): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccjnWyQ1.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

Добавлено через 4 минуты
Код набирал в gedit, запускал в терминале...
0
6908 / 5973 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
17.07.2015, 09:40 4
У меня работает. Только надо память ещё освободить в конце.
Ты, наверное, неправильно компилируешь, особенно если через командную строку, а не в среде. Установи какую-нибудь среду разработки.
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.07.2015, 10:11 5
Грустные смайлики хорошо отражают ситуацию.
Цитата Сообщение от max_sk Посмотреть сообщение
Код набирал в gedit, запускал в терминале...
А компилировал как? Попробуй:
g++ prog.cpp
Результат в a.out будет
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
17.07.2015, 14:21  [ТС] 6
Точно! Я компилировал в gcc! Вот что значит перескакивать с одного языка на другой на разных курсах. Спасибо! :-)

Добавлено через 7 минут
Кстати, подскажите как выйти с форума? Нигде не вижу кнопки выход...
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.07.2015, 14:26 7
Цитата Сообщение от max_sk Посмотреть сообщение
как выйти с форума?
Справа внизу.
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
17.07.2015, 18:29  [ТС] 8
Еще возникли вопросы по этому заданию...

Подскажите как перегрузить operator >> и operator << при работе с объектами класса string.
0
6908 / 5973 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
17.07.2015, 18:35 9
Класс свой покажи.
0
13474 / 7137 / 1712
Регистрация: 30.01.2014
Сообщений: 11,936
17.07.2015, 19:57 10
Цитата Сообщение от max_sk Посмотреть сообщение
Я компилировал в gcc! Вот что значит перескакивать с одного языка на другой на разных курсах.
GCC прекрасно компилирует С++ (он же GNU Compiler Collection, а не GNU C Compiler), только вот по-умолчанию он не линкует реализацию стандартной библиотеки. Иногда это даже полезно Поэтому были такие ошибки.
Bash
1
gcc prog.cpp -lstdc++
Цитата Сообщение от max_sk Посмотреть сообщение
Подскажите как перегрузить operator >> и operator << при работе с объектами класса string.
Если речь идет о перегрузке << и >> для самого std::string, то они уже есть в std::.
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
18.07.2015, 08:16  [ТС] 11
DrOffset, задание просто такое - самому написать. Сейчас выложу класс...

Добавлено через 3 минуты
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
#include <iostream>
#include <string>
using namespace std;
 
class Word
{
private:
    string *itsString;
public:
    Word();
    Word( Word &wrd);
    //~Word();                            // Также почему то не работает деструктор, программа выпадает в дамп !
    Word& operator= ( const Word &wrd );
    Word& operator+ ( const Word &wrd1 );
    Word& operator+=( const Word &wrd1 );
    bool operator==(const Word &wrd1 );
    Word& operator++( int );
    string operator[] ( int num );
    bool operator< ( const Word &wrd1 );
    istream& operator >> ( Word& wrd1  ); // Здесь проблема !
        
    void setWord( string str1);
    string getWord();
    void Print();
};
Добавлено через 26 секунд
Это его имплементация

Добавлено через 48 секунд
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
Word::Word()
{
    cout << "C'tor called..." << endl;
    itsString=new string;
    *itsString="NoName";
}
 
Word::Word( Word &wrd)
{
    cout << "Copy c'tor called..." << endl;
    itsString=wrd.itsString;
}
 
/*Word::~Word()
{
    cout << "D'tor called..." << endl;
    delete itsString;
    itsString=NULL;
}*/
 
Word& Word::operator= ( const Word &wrd )
{
    itsString=wrd.itsString;
    return *this;
}
 
Word& Word::operator+ ( const Word &wrd1 )
{
    *(this->itsString)+=*wrd1.itsString;
    return *this;
}
 
Word& Word::operator+=( const Word &wrd1 )
{
    *(this->itsString)+=*wrd1.itsString;
    return *this;
}
 
bool Word::operator==(const Word &wrd1 )
{
    return ( *(this->itsString)==*wrd1.itsString );
}
 
Word& Word::operator++( int )
{
    int i=0;
    string temp= *itsString;
 
    while(temp[i]!='\0') i++;   
    temp[i-1]++;
    *itsString=temp;
    return *this;
}
 
string Word::operator[] ( int num )
{
    return itsString->substr(num,1);
}
 
void Word::setWord( string str1)
{
    *itsString=str1;
}
 
bool Word::operator< ( const Word &wrd1 )
{
    return ( *itsString < *wrd1.itsString );
}
 
istream& Word::operator >> ( Word& wrd1  )
{
    string temp;
    istream is;
  
    is.getline(temp, 255);
    *wrd1.itsString=temp;
  
    return is; 
}
 
string Word::getWord()
{
    return *itsString;
}
 
void Word::Print()
{
    cout << *itsString << endl;
}
0
3200 / 2012 / 345
Регистрация: 24.11.2012
Сообщений: 4,839
18.07.2015, 08:20 12
Динамическое выделение памяти для itsString тут не нужно.
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
18.07.2015, 08:29  [ТС] 13
Согласен, что не нужно, но в задании хотят. Наверное задание дурацкое. :-)
Сейчас выложу...

Добавлено через 10 секунд
Declare a class named Word with the following data members:
• itsString: points to dynamically malloc'ed string, updated upon
construction, or copying(= operator).
• Default c-tor: initializing string to "NoName".
• Copy c-tor: deep copying the string from another Word.
• Assignment operator =: deep copying the string from another Word.
• Operator +: wrd3 = wrd1+wrd2; will concatenate both strings and
return an object containing the result, without changing wrd1, wrd2.
• Operator +=: wrd1+= wrd2 will concatenate wrd2's string to
wrd1's string, without changing wrd2.
• Operator ==: compares two words
• Operator++: increments (cyclic) the first letter of the word one step.
for example:
"boyd" to "boye", "lebizz" to "lebiza"
• Operator casting ( ): cast Word to char*
• Operator [] : wrd1[i]returns the i-th char in the string or * if i is
beyond length.
• Operator < : lexicographic comparison – wrd1< wrd2 if the string
in wrd1 comes before that of wrd2 in the dictionary.
• Operator >> : cin >> wrd1: for reading an entire string from
stdin (keyboard), and assigning them to wrd1.
• Operator <<: cout << wrd1: for printing the entire string stored in
wrd1to stdout (screen).
0
3200 / 2012 / 345
Регистрация: 24.11.2012
Сообщений: 4,839
18.07.2015, 08:32 14
Цитата Сообщение от max_sk Посмотреть сообщение
• itsString: points to dynamically malloc'ed string, updated upon
construction, or copying(= operator).
Скорее всего, требуется сишная строка и сишные же функции работы с памятью. Иначе задание сводится к написанию обертки над std::string, которая тупо передает управление методам с уже реализованной работой с памятью.
0
6908 / 5973 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
18.07.2015, 08:33 15
C++
1
2
3
4
5
friend std::istream & operator >> (std::istream &is, const Word& wrd1)
{
    is.getline(*(wrd1.itsString), 255);
    return is;
}
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.07.2015, 09:56 16
nmcf, ссылка на Word всё же не const должна быть.
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
18.07.2015, 11:54  [ТС] 17
Мой компайлер почему то ругается, что у метода operator >> должен быть один аргумент почему то... Сейчас проверю еще раз...

Добавлено через 6 минут
Вот что он пишет...

Добавлено через 26 секунд
[maxim@localhost Desktop]$ g++ Targil3-3.cpp -o Targil3-3
Targil3-3.cpp:20:53: ошибка: «std::istream& Word::operator>>(std::istream&, const Word&)» должен иметь ровно один аргумент
istream& operator >> (istream &is, const Word& wrd1);
^
Targil3-3.cpp:96:58: ошибка: «std::istream& Word::operator>>(std::istream&, const Word&)» должен иметь ровно один аргумент
istream& Word::operator >> (istream &is, const Word& wrd1)
^
Targil3-3.cpp: В функции «int main()»:
Targil3-3.cpp:140:6: ошибка: no match for «operator>>» (operand types are «std::istream {aka std::basic_istream<char>}» and «Word»)
cin >> wrd4;

Добавлено через 1 минуту
Разумеется я немного переделал метод под свой класс...

Добавлено через 27 секунд
C++
1
2
3
4
5
istream& Word::operator >> (istream &is, const Word& wrd1)
{
    is.getline(*(wrd1.itsString), 255);
    return is;
}
Добавлено через 2 минуты
Выкладываю свой main() на всякий случай...

Добавлено через 40 секунд
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
int main()
{
    Word wrd1, wrd2, wrd3, wrd4;
    wrd2.setWord("Hello");
    wrd3.setWord(",Maksim");
 
    wrd2=wrd2+wrd3;
    cout << "wrd2 is ";
    wrd2.Print();
 
    wrd1+=wrd3;
    cout << "wrd1 is ";
    wrd1.Print();
    cout << "wrd3 is ";
    wrd3.Print();
 
    (wrd1==wrd2)?(cout << "wrd1 is equal to wrd2" << endl):(cout << "wrd1 is NOT equal to wrd2" << endl);
 
    (wrd1<wrd2)?(cout << "wrd1 is comes before that of wrd2 in dictionary" << endl):(cout << "wrd2 is comes before that of wrd1" << endl);
 
    cout << "Enter the wrd4: ";
    cin >> wrd4;
 
    return 0;
}
Добавлено через 9 минут
Может в main() ввод объекта надо по другому как то сделать? :-((
0
3200 / 2012 / 345
Регистрация: 24.11.2012
Сообщений: 4,839
18.07.2015, 11:57 18
max_sk, если оператор перегружен как метод класса, то он должен принимать один аргумент, если как свободная функция — два.
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 776
18.07.2015, 12:19  [ТС] 19
А, спасибо, не знал... Не могли бы подсказать, как должен выглядеть метод класса в таком случае? А то у меня в решении дано как у вас - внешний friend-метод...
0
6908 / 5973 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
18.07.2015, 12:29 20
Цитата Сообщение от Tulosba Посмотреть сообщение
ссылка на Word всё же не const должна быть
Да, я просто скопировал с оператора <<.

Добавлено через 3 минуты
Цитата Сообщение от max_sk Посмотреть сообщение
как должен выглядеть метод класса в таком случае?
Я же тебе показал как должно быть с friend. Если делаешь раздельно, то в заголовке класса friend, в реализации friend и принадлежность к классу не указывать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2015, 12:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Найти поле в объекте и присвоить ему значение
Добрый день! Мне необходимо загрузить данные из XML и присвоить соответствующие значения из XML...

Сравнить каждый элемент массива и присвоить ему новое значение в соотвествии с условиями
Добрый день! Задача - сравнить каждый элемент массива и присвоить ему новое значение в...

Найти минимальное число в двумерном массиве в данном столбце и присвоить ему значение 0
Мне нужно понять в итоге какой номер в массиве имеет найденное минимальное число чтобы присвоить...

выделить место для объекта с помощью new или создать указатель, объект и присвоить один другому. какая разница?
кроме того что к объекту созданному с помощью new можно будет обращаться только через указатель.


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

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

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