powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется пример из книги Шилдта
17 сообщений из 17, страница 1 из 1
Не компилируется пример из книги Шилдта
    #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
Не компилируется пример из книги Шилдта
    #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
Не компилируется пример из книги Шилдта
    #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
Не компилируется пример из книги Шилдта
    #40009544
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
У тебя кто отвественен за хранение строки s? Пользователь? Или класс sample?

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

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


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



Ну и про unsafe выше уже писали.
...
Рейтинг: 0 / 0
Не компилируется пример из книги Шилдта
    #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
Не компилируется пример из книги Шилдта
    #40009617
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сомнительный пример. Скользко там... со строками... скользко. Уж лучше-бы комплексные числа или дроби.
...
Рейтинг: 0 / 0
Не компилируется пример из книги Шилдта
    #40009655
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это зачем? Какая тут мотивация?

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

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


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

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



Кстати этот код одинаковый для всех версий стандарта начиная с самой первой.
Так что если в какой-то книге написано что оператор = возвращает не ссылку, а копию, то выкиньте эту книгу.
...
Рейтинг: 0 / 0
Не компилируется пример из книги Шилдта
    #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
Не компилируется пример из книги Шилдта
    #40009738
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем ее ( пустую строку) вообще где-то выделять?

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

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

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

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


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