Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется пример из книги Шилдта / 17 сообщений из 17, страница 1 из 1
17.10.2020, 23:10
    #40009526
kvazar1977
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Код: plaintext
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.
// ConsoleApplication1.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <cstring>
#include<cstdlib>
using namespace std;

class sample {
	char* s;
public:
	sample();
	sample(const sample &ob);
	~sample() {
		if (s) delete[] s;
		cout << "Free s-memory.\n";	}
	void show() { cout << s << "\n"; }
	void set(char* str);
	sample operator=(sample &ob);
};

sample::sample() {
	s = new char('\0');
}

sample::sample(const sample &ob)
{
	s = new char[strlen(ob.s) + 1];
	strcpy(s, ob.s);
}

void sample::set(char* str)
{
	s = new char[strlen(str) + 1];
	strcpy(s, str);
}

sample sample::operator=(sample &ob)
{
	if (strlen(ob.s) > strlen(s)) {
		delete[]s;
		s=new char[strlen(ob.s)+1];
	}
	strcpy(s,ob.s);
	return *this;
}

sample input() {
	char instr[80];
	sample str;
	cout << "Input stroka: ";
	cin >> instr;
	str.set(instr);
	return str;
}


int main()
{
	sample ob;
	ob = input();
	ob.show();
	return 0;
}



c++ базовый курс стр.338
ошибки следующие
Severity Code Description Project File Line Suppression State
Error (active) E0349 no operator "=" matches these operands ConsoleApplication1 C:\Users\Admin\source\repos\ConsoleApplication1\ConsoleApplication1.cpp 60
Error C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. ConsoleApplication1 C:\Users\Admin\source\repos\ConsoleApplication1\ConsoleApplication1.cpp 29
Error C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. ConsoleApplication1 C:\Users\Admin\source\repos\ConsoleApplication1\ConsoleApplication1.cpp 35
Error C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. ConsoleApplication1 C:\Users\Admin\source\repos\ConsoleApplication1\ConsoleApplication1.cpp 44
Error C2679 binary '=': no operator found which takes a right-hand operand of type 'sample' (or there is no acceptable conversion) ConsoleApplication1 C:\Users\Admin\source\repos\ConsoleApplication1\ConsoleApplication1.cpp 61
...
Рейтинг: 0 / 0
17.10.2020, 23:33
    #40009528
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
У тебя кто отвественен за хранение строки s? Пользователь? Или класс sample?
Если я несколько раз сделаю set:
Код: plaintext
1.
2.
3.
4.
5.
sample ob;
ob.set("H");
ob.set("He");
ob.set("Hel");
ob.set("Hell");
...
Рейтинг: 0 / 0
18.10.2020, 07:49
    #40009543
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
kvazar1977
Error C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

В MSVC по умолчанию запрещены функции, которые могут выйти за пределы строки.
Для разрешения добавь в самое начало
Код: plaintext
1.
2.
3.
4.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
...
...
Рейтинг: 0 / 0
18.10.2020, 08:03
    #40009544
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
mayton
У тебя кто отвественен за хранение строки s? Пользователь? Или класс sample?

Самое забавное что он это учел при перегрузке оператора =
...
Рейтинг: 0 / 0
18.10.2020, 11:24
    #40009566
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Dima T
mayton
У тебя кто отвественен за хранение строки s? Пользователь? Или класс sample?

Самое забавное что он это учел при перегрузке оператора =


Если я правильно помню перегрузку оператора =, то там дичь полнейшая (с возвращаемым типом). Могу ошибаться, компилятор C++ на компьютере стоял лет 7 назад )))
...
Рейтинг: 0 / 0
18.10.2020, 12:39
    #40009571
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Код: plaintext
1.
sample& sample::operator=(const sample &ob)



Ну и про unsafe выше уже писали.
...
Рейтинг: 0 / 0
18.10.2020, 15:32
    #40009591
kvazar1977
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include<cstdlib>
using namespace std;

class sample {
	char* s;
public:
	sample();
	sample(const sample &ob);
	~sample() {
		if (s) delete[] s;
		cout << "Free s-memory.\n";	}
	void show() { cout << s << "\n"; }
	void set(char* str);
	sample operator=(const sample &ob);
};



вот так работает, спасибо. использую стандарт с++17, а пример видимо 10 летней давности.
...
Рейтинг: 0 / 0
18.10.2020, 19:50
    #40009617
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Сомнительный пример. Скользко там... со строками... скользко. Уж лучше-бы комплексные числа или дроби.
...
Рейтинг: 0 / 0
19.10.2020, 01:10
    #40009655
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
А это зачем? Какая тут мотивация?

Код: plaintext
1.
2.
3.
sample::sample() {
	s = new char('\0');
}
...
Рейтинг: 0 / 0
19.10.2020, 10:16
    #40009726
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
mayton
А это зачем? Какая тут мотивация?

Код: plaintext
1.
2.
3.
sample::sample() {
	s = new char('\0');
}


Это пустая строка. Мотивация - простота кода ))
...
Рейтинг: 0 / 0
19.10.2020, 10:20
    #40009729
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
kvazar1977,

Должно быть так:
Код: plaintext
1.
sample& operator=(const sample &ob);



Кстати этот код одинаковый для всех версий стандарта начиная с самой первой.
Так что если в какой-то книге написано что оператор = возвращает не ссылку, а копию, то выкиньте эту книгу.
...
Рейтинг: 0 / 0
19.10.2020, 10:24
    #40009732
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Anatoly Moskovsky
mayton
А это зачем? Какая тут мотивация?

Код: plaintext
1.
2.
3.
sample::sample() {
	s = new char('\0');
}



Это пустая строка. Мотивация - простота кода ))

А, не. Так нельзя делать:
Код: plaintext
1.
s = new char('\0');


Потому что потом это удаляется через delete[].

Правильно так:
Код: plaintext
1.
2.
s = new char[1];
s[0] = '\0';
...
Рейтинг: 0 / 0
19.10.2020, 10:38
    #40009738
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
А зачем ее ( пустую строку) вообще где-то выделять?

Она же иммутабельная. Можно сделать глобальную константу - пустышку и просто на нее ссылаться.
...
Рейтинг: 0 / 0
19.10.2020, 11:20
    #40009755
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
mayton
А зачем ее ( пустую строку) вообще где-то выделять?

Она же иммутабельная. Можно сделать глобальную константу - пустышку и просто на нее ссылаться.

Можно. А зачем? Чем эта не устраивает? ))
...
Рейтинг: 0 / 0
19.10.2020, 11:31
    #40009761
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Экономия ресурсов. Разве не в традициях С++ разработки экономить?
Иногда несколько байт экономят на теле класса. А тут - тупо аллоцируют пустышку.
...
Рейтинг: 0 / 0
19.10.2020, 11:57
    #40009773
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
mayton,

Это называется преждевременная оптимизация.
Не всегда экономит ресурсы.
...
Рейтинг: 0 / 0
19.10.2020, 11:58
    #40009775
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется пример из книги Шилдта
Как будет угодно. Я не настаиваю.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется пример из книги Шилдта / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]