Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2012, 21:54   #21
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
почему это копирование должно быть const ?
конструктор копии не имеет права изменять исходный обьект.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2012, 00:01   #22
trashem
Новичок
Джуниор
 
Аватар для trashem
 
Регистрация: 20.09.2012
Сообщений: 1
По умолчанию

Оценил дохлого страуса =)
http://radiozone.xe0.ru/ - блог о IT и радиотехнике
trashem вне форума Ответить с цитированием
Старый 23.09.2012, 20:23   #23
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Код:
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream>

using namespace std;

class String {
private: 
	char* data;
public:

	String () {
		//конструктор по умолчанию (создает пустую строку)
		data = new char[1];
		data = "";
	}

	String (char* my_str /*= 0*/) { 
		// конструктор с параметром
		data = new char[strlen(my_str) + 1];
		strcpy(data, my_str);			
	}
	String (const String& my_str) {
		// конструктор копирования (в качестве параметра передается ссылка на существующий объект)
		data = new char[strlen(my_str.data) + 1];
		strcpy(data, my_str.data);
	}

	~String () {
		// деструктор
		cout << "destructor"<< endl; // просто для наглядности, что видно было, что запускается наш, а не дофолтный деструктор
		delete[] data;				 // в конце блока использования объектов класса String (в нашем случае, в конце программы и в методах, где создаются временные объекты класса) будет
	}								 // выводится строчка destructor для каждого "уничтоженного" объекта.

	void display () const {			 // функция просто выводит содержимое объекта на экран
		cout << data << endl;
	}

	// просто объявление части функций (методов) в классе
	
	String& operator=  (const String&);			// перегрузка оператора присваивания
	String& operator=  (const char*);			// перегрузка оператора присваивания (-//-)

	
	operator char* () const {			 // оператор привидения объектов класса стринг к переменным типа char*
		return data;
	}
};
//------------------------------------------------------------------------------------------------------------------
//---------------------------------------- Описание методов класса -------------------------------------------------




String& String::operator= (const String& my_str) {
	// короче в c++ достаточно специфичный случай для равенства объектов obj = obj, поэтому его надо "обойти"
	if(this != &my_str && my_str.data) { // this - e
		data = new char[strlen(my_str.data) + 1];
		strcpy(data, my_str.data);
	}
	return *this;
}

String& String::operator= (const char* my_str) {
	if (my_str) {
		data = new char[strlen(my_str) + 1];
		strcpy(data, my_str);
	}
	return *this;
}



int main() {
	String str1; // пустая строка, используется конструктор по умолчанию
	String str2 = "Privet!"; // используется конструктор с одним параметром
	String str3("Dobrui Den!"); // также используется конструктор с одним параметром 
	String str4 = str2; // конструктор копирования
	String str5(str3);  // конструктор копирования

	//----------------------------
	cout << "proverka rabotu konstruktorov:" << endl;
	str1.display();
	str2.display();
	str3.display();
	str4.display();
	str5.display();
	//----------------------------

	//----------------------------
	cout << "\nproverka operatora privideniya k tipu \"char\": " << endl;
	cout << "data obiekta str2 = ";
	str2.display();
	char* gavnoCHAROVSKOE = str2;
	cout << "peremenaya gavnoCHAROVSKOE posle prispoeniya znacheniya str2 = " << gavnoCHAROVSKOE << endl;
	//----------------------------

	//----------------------------
	cout << "\nproverka rabotu operatora prisvaivania:" << endl;
	str2.display();
	str5.display();
	cout << "teper prisvaivaem str2 = str5..." << endl;
	str2 = str5;
	str2.display();
	str5.display();
	
	

	cout << "\n\n\n\n\n";

	getch();
	return 0;
}

Все равно косячит именно деструктор
sidestep вне форума Ответить с цитированием
Старый 23.09.2012, 20:54   #24
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2sidestep
Код:
data = new char[1];
data = "";
чтож ты творишь то
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.09.2012, 04:23   #25
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

создает пустую строку по умолчанию
все работает
что не так ?
sidestep вне форума Ответить с цитированием
Старый 24.09.2012, 06:26   #26
Demon123123
 
Регистрация: 23.09.2012
Сообщений: 3
По умолчанию

Действительно нормальный конструктор по умолчанию....
Кстати в классе заместо метода display надо было бы перегрузить операцию <<,ну можно было бы еще и операцию >>
Demon123123 вне форума Ответить с цитированием
Старый 24.09.2012, 11:22   #27
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2sidestep
Цитата:
создает пустую строку по умолчанию
2Demon123123
Цитата:
Действительно нормальный конструктор по умолчанию....
язык подучите
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.09.2012, 11:44   #28
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Цитата:
Сообщение от sidestep Посмотреть сообщение
создает пустую строку по умолчанию
все работает
что не так ?
Если бы работало, вы бы не жаловались на конструктор/деструктор. Я же вам писал: "А вы выделяете память для data а потом *меняете* указатель"
Копировать строки надо через strcpy а не присваиванием.
waleri вне форума Ответить с цитированием
Старый 24.09.2012, 14:10   #29
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

pproger

напиши нормальный
sidestep вне форума Ответить с цитированием
Старый 24.09.2012, 14:21   #30
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2sidestep
по-нормальному все переписывать надо. для твоего случая можно ограничиться
Код:
data = new char[1];
*data = '\0';
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сТРОКИ ООП С++ Camom1Le Помощь студентам 0 30.11.2010 21:55
C++ ООП Smile.id Помощь студентам 2 21.02.2010 13:41
ООП AlekDruzh Паскаль, Turbo Pascal, PascalABC.NET 0 09.09.2009 20:32
Паскаль ООП. Примеры программ с использованием ООП SeЯgey Помощь студентам 5 13.05.2009 21:55