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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2011, 14:59   #1
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию Классы с++

Подскажите, пожалуйста, в чем суть ошибки и как исправть?

Код:
// lab5.2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <tchar.h>
 

using namespace std;

class Worker
{
	char* name;
	char* surname;

public:

	Worker();
	Worker(char* Nname, char* Nsurname);
	~Worker();
	void setname(char* Nname);
	void setsurname(char* Nsurname);
	char* getname();
	char* getsurname();
};

Worker::Worker()
{
	name = new char[255];
	surname = new char[255];
	//dateofbirth = new date;
	cout << "Object created";
	cout << '\n';
}

Worker::Worker(char* Nname, char* Nsurname)
			{
				name = new char[255];
				surname = new char[255];
				//dateofbirth = new date;
				for (int i=0 ; Nname[i]; i++)
					{
						name[i] = Nname[i];
						surname[i] = Nsurname[i];
					}
				cout << "Object created";
				cout << '\n';
			}
Worker::~Worker()
{
	delete []name;
	delete []surname;
	cout << "Object destryed";
	cout << '\n';
}

void Worker::setname(char* Nname)
{
	delete []name;
	name = new char[255];
	for (int i=0; Nname[i] ; i++)
		{
			name[i] = Nname[i];
		}
	cout << "Name was set" << '\n';
}

void Worker::setsurname(char* Nsurname)
{
	delete []surname;
	surname = new char[255];
	for (int i=0; Nsurname[i] ; i++)
		{
			surname[i] = Nsurname[i];
		}
	cout << "Surname was set" << '\n';
}

char* Worker::getname()
{
	char* Nname;
	Nname = new char[255];
	for (int i=0; name[i]; i++)
		{
			Nname[i] = name[i];
			Nname[i+1] = '\0';
		}
	return Nname;
}

char* Worker::getsurname()
{
	char* Nsurname;
	Nsurname = new char[255];
	for (int i=0; surname[i]; i++)
		{
			Nsurname[i] = surname[i];
			Nsurname[i+1] = '\0';
		}
	return Nsurname;
}

int _tmain(int argc, _TCHAR* argv[])
{
	Worker work1;

    char* Nname;
	char* Nsurname;
	gets(Nname);
	work1.setname(Nname);
	gets(Nsurname);
	work1.setsurname(Nsurname);
	cout << work1.getname() << '\n';
	cout << work1.getsurname() << '\n';
	work1.~Worker();
	return 0;
}
Программ запускается , выдает debug error и прерывается.

Последний раз редактировалось Blad47; 11.03.2011 в 15:07.
Blad47 вне форума Ответить с цитированием
Старый 11.03.2011, 15:10   #2
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
work1.~Worker();
первое что бросилось в глаза. Деструкторы явно не вызываются. Убери эту строку.
profi вне форума Ответить с цитированием
Старый 11.03.2011, 15:30   #3
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Это не вызывает ошибок. А как тогда вызывать деструктор?
Я попробовал удалить строчку, все равно программа не работает. Вылетает debug error

Последний раз редактировалось Blad47; 11.03.2011 в 15:32.
Blad47 вне форума Ответить с цитированием
Старый 11.03.2011, 15:31   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

А ну тебе виднее как правильно. Но книжку все таки советую почитать.
profi вне форума Ответить с цитированием
Старый 11.03.2011, 15:36   #5
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Ошибка выскакивает на этом этапе:
gets(Nname);

Run-Time Check Failure #3 - The variable 'Nname' is being used without being initialized.
Blad47 вне форума Ответить с цитированием
Старый 11.03.2011, 15:41   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
  char* Nname;
	char* Nsurname;;
А указатели то куда указывают?

Я бы сделал так:
Код:
  char Nname[255];
	char Nsurname[255];
Цитата:
Я попробовал удалить строчку, все равно программа не работает. Вылетает debug error
Дело в том, что деструкторы, трезвый программист, никогда не будет вызывать явно. Деструкторы вызываются автоматически при уничтожении объекта, если он например вышел из области видимости, или при вызове оператора delete(если конечно объект был создан динамически).
Кстати это вообще жесть:
Код:
	delete []surname;
	surname = new char[255];
Все таки почитай книжку по С++, не поленись. Так как ошибок в коде полно, только что нашел.

Последний раз редактировалось profi; 11.03.2011 в 15:54.
profi вне форума Ответить с цитированием
Старый 11.03.2011, 16:04   #7
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Спасибо, щас попробую исправить!
Да, я читаю постепенно книжку, просто не успеваю лабы делать.
Уровень заданий не низкий, а уровень подготовки невысок.
Blad47 вне форума Ответить с цитированием
Старый 11.03.2011, 17:29   #8
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Я сделал, спасибо. Исправил криво, но главное работает.
У меня такой вопрос.
Я динамичкски создаю массив из десяти символов.
name = new char[10];
Но прогоняя трассировку, вижу такое:
name 0x003c8920 "ННННННННННээээ««««««««ою" char *

Как можно создать массив и полностью его обнулив?
Тут явно больше 10 элементов, хотя я создаю 10...
Blad47 вне форума Ответить с цитированием
Старый 11.03.2011, 17:49   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Функция memset.
profi вне форума Ответить с цитированием
Старый 11.03.2011, 20:23   #10
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Код:
				for (int i=0 ; Nname[i]; i++)
					{
						name[i] = Nname[i];
						surname[i] = Nsurname[i];
					}
юзайте strcpy!


Код:
char* Worker::getname() 
char* Worker::getsurname()
- тела аццкие.
юзайте return name; return surname;
и вообще хорошо было бы
Код:
const char* Worker::getname() const
const char* Worker::getsurname() const
onewho вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
классы денис николюк Помощь студентам 1 21.01.2011 00:08
классы Dimarik Общие вопросы C/C++ 1 18.09.2009 20:32