Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Не компилируется пример из книги Шилдта  [new]
kvazar1977
Member

Откуда:
Сообщений: 42
// 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
17 окт 20, 23:10    [22216087]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
mayton
Member

Откуда: loopback
Сообщений: 49319
У тебя кто отвественен за хранение строки s? Пользователь? Или класс sample?
Если я несколько раз сделаю set:
sample ob;
ob.set("H");
ob.set("He");
ob.set("Hel");
ob.set("Hell");
17 окт 20, 23:33    [22216094]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Dima T
Member

Откуда:
Сообщений: 15111
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 по умолчанию запрещены функции, которые могут выйти за пределы строки.
Для разрешения добавь в самое начало
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
...
18 окт 20, 07:49    [22216154]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Dima T
Member

Откуда:
Сообщений: 15111
mayton
У тебя кто отвественен за хранение строки s? Пользователь? Или класс sample?

Самое забавное что он это учел при перегрузке оператора =
18 окт 20, 08:03    [22216155]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9083
Dima T
mayton
У тебя кто отвественен за хранение строки s? Пользователь? Или класс sample?

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


Если я правильно помню перегрузку оператора =, то там дичь полнейшая (с возвращаемым типом). Могу ошибаться, компилятор C++ на компьютере стоял лет 7 назад )))
18 окт 20, 11:24    [22216217]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6608
sample& sample::operator=(const sample &ob)


Ну и про unsafe выше уже писали.
18 окт 20, 12:39    [22216238]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
kvazar1977
Member

Откуда:
Сообщений: 42
#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 летней давности.

Сообщение было отредактировано: 18 окт 20, 15:28
18 окт 20, 15:32    [22216292]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
mayton
Member

Откуда: loopback
Сообщений: 49319
Сомнительный пример. Скользко там... со строками... скользко. Уж лучше-бы комплексные числа или дроби.
18 окт 20, 19:50    [22216343]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
mayton
Member

Откуда: loopback
Сообщений: 49319
А это зачем? Какая тут мотивация?

sample::sample() {
	s = new char('\0');
}
19 окт 20, 01:10    [22216428]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6608
mayton
А это зачем? Какая тут мотивация?

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

Это пустая строка. Мотивация - простота кода ))
19 окт 20, 10:16    [22216560]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6608
kvazar1977,

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


Кстати этот код одинаковый для всех версий стандарта начиная с самой первой.
Так что если в какой-то книге написано что оператор = возвращает не ссылку, а копию, то выкиньте эту книгу.
19 окт 20, 10:20    [22216565]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6608
Anatoly Moskovsky
mayton
А это зачем? Какая тут мотивация?

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


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

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

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

Правильно так:
s = new char[1];
s[0] = '\0';
19 окт 20, 10:24    [22216571]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
mayton
Member

Откуда: loopback
Сообщений: 49319
А зачем ее ( пустую строку) вообще где-то выделять?

Она же иммутабельная. Можно сделать глобальную константу - пустышку и просто на нее ссылаться.
19 окт 20, 10:38    [22216584]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6608
mayton
А зачем ее ( пустую строку) вообще где-то выделять?

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

Можно. А зачем? Чем эта не устраивает? ))
19 окт 20, 11:20    [22216611]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
mayton
Member

Откуда: loopback
Сообщений: 49319
Экономия ресурсов. Разве не в традициях С++ разработки экономить?
Иногда несколько байт экономят на теле класса. А тут - тупо аллоцируют пустышку.
19 окт 20, 11:31    [22216621]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6608
mayton,

Это называется преждевременная оптимизация.
Не всегда экономит ресурсы.
19 окт 20, 11:57    [22216650]     Ответить | Цитировать Сообщить модератору
 Re: Не компилируется пример из книги Шилдта  [new]
mayton
Member

Откуда: loopback
Сообщений: 49319
Как будет угодно. Я не настаиваю.
19 окт 20, 11:58    [22216653]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить