Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
HERETIC
90 / 90 / 3
Регистрация: 10.10.2008
Сообщений: 607
Завершенные тесты: 1
#1

Нужен совет по исправлению ошибки в функции - C++

18.01.2013, 19:00. Просмотров 385. Ответов 10
Метки нет (Все метки)

Помогите исправить ошибку в функции GetName. Все файлы прилагаю:
myclass.h
C++
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
#ifndef MYCLASS_H
#define MYCLASS_H
 
class persona
{
private:
    char *name;
    int age;
    bool pol;
    static int count_object;
    static persona **list;
public:
    persona();
    persona(char *, int, bool);
    virtual ~persona();
    static void showList();
    virtual void showObject();
    void Add();
    static void clearList();
    void setName(char *);
    void setAge(int );
    void setPol(bool );
    char GetName();
    int GetAge();
    bool GetPol();
};
#endif
persona.cpp
C++
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "myclass.h"
#include <iostream>
#include <cstring>
 
using namespace std;
 
persona ** persona::list = new persona *[100];
int persona::count_object=0;
 
persona::persona()
{
    name="Мазай";
    age=55;
    pol=true;
}
 
persona::persona(char *_name, int _age, bool _pol)
{
    name = new char[strlen(_name)+1];
    strcpy(name, _name);
    age=_age;
    pol=_pol;
}
 
persona::~persona()
{
    delete name;
}
 
void persona::Add()
{
    this->list[count_object]=this;
    count_object++;
}
 
void persona::showList()
{
    for(int i=0; i<count_object; ++i)
    {
        list[i]->showObject();
    }
}
 
void persona::showObject()
{
    
    std::cout << "Показываем информацию об объекте: " << std::endl;
    std::cout << "Имя: " << name << std::endl;
    std::cout << "Возраст: " << age << std::endl;
    std::cout << "Пол: " << pol << std::endl;
    std::cout << std::endl;
}
 
void persona::setName(char *_name)
{
    name=_name;
}
 
void persona::setAge(int _age)
{
    age=_age;
}
 
void persona::setPol(bool _pol)
{
    pol=_pol;
}
 
char persona::GetName()
{
    return *name;
}
 
int persona::GetAge()
{
    return age;
}
 
bool persona::GetPol()
{
    return pol;
}
 
void persona::clearList()
{
    for(int i=0; i< count_object;i++)
    {
        std::cout << "Delete: " << std::endl;
        list[i]->showObject();;
        delete list[i];
    }
    delete [] list;
}
main.cpp
C++
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
#include <iostream>
#include <conio.h>
#include "myclass.h"
using namespace std;
 
int main()
{
    setlocale(0, "Russian");
 
    persona *kolia = new persona("Коля", 12, true);
    kolia->Add();
 
    persona *Olia = new persona("Оля", 32, false);
    Olia->Add();
 
    persona *vasia = new persona();
    vasia->Add();
 
    char charpr;
    int intpr;
    bool boolpr;
 
    charpr=kolia->GetName();
    cout << "Проверка GetName " << charpr << endl;
    intpr=Olia->GetAge();
    cout << "Полверка GetAge " << intpr << endl;
    boolpr=vasia->GetPol();
    cout << "Проверка GetPol " << boolpr << endl;
 
    _getch();
 
    vasia->setName("Петя");
    vasia->setAge(44);
    vasia->setPol(true);
 
    persona::showList();
    persona::clearList();
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2013, 19:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужен совет по исправлению ошибки в функции (C++):

Нужен совет с исправлением ошибки - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;locale.h&gt; #include &lt;Windows.h&gt; #include &lt;time.h&gt; #include &lt;stdio.h&gt; using...

Очень нужен совет где найти ошибки в программе - C++
//Obrabotka rezulitatov sessii s ispolizovaniem functii #include&lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;string.h&gt; #include&lt;assert.h&gt; ...

Нужен совет! - C++
Народ вот у меня вопрос если я прочитаю книгу &quot;Программирование. Принцыпы и практика использования C++&quot; и кое что не пойму то стоит ли...

нужен совет!!! - C++
блин скачала еле как этот си...dev c++....ввожу программу и нажимаю компелировать...он компелирует видимо и ничего не выдает...кроме того...

Нужен совет! - C++
Доброго времени суток! Возможно таких тем как эта было уже миллион.. но всё же, хотелось бы услышать ваше мнение. Поставил перед...

Нужен совет: - C++
я учусь в 2-ом курсе на программиста у меня есть базовые знание c++,STL до сих пор работал только с консолью,опыта нету что дальше...

10
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
18.01.2013, 19:04 #2
C++
1
2
3
4
char* persona::GetName()
{
    return *name;
}
Следи за тем что ты делаеш. Указатель и просто переменная-две большие разницы.
1
HERETIC
90 / 90 / 3
Регистрация: 10.10.2008
Сообщений: 607
Завершенные тесты: 1
18.01.2013, 21:34  [ТС] #3
Спасибо исправил. Сам не знаю как не заметил. Но походу еще где-то косяк. Программа компилируется, но на завершающем этапе (объекты уничтожаются), вываливается с ошибкой. Если нужно приведу скрин.
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
18.01.2013, 21:40 #4
del
0
Croessmah
Эксперт CЭксперт С++
13420 / 7574 / 855
Регистрация: 27.09.2012
Сообщений: 18,650
Записей в блоге: 3
Завершенные тесты: 1
18.01.2013, 21:42 #5
Цитата Сообщение от SeregaC++ Посмотреть сообщение
может я не досмотрел. Но я не вижу выдиления памяти под char *name;
строка 19:
C++
1
name = new char[strlen(_name)+1];
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
18.01.2013, 21:53 #6

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
строка 19:
C++
1
name = new char[strlen(_name)+1];
сорри. Не досмотрел.



Добавлено через 1 минуту
Croessmah, а если, в конструкторе по умолчанию.

Добавлено через 1 минуту
и 16 строка. persona *vasia = new persona();

Добавлено через 16 секунд
вызывает по умолчанию.

Добавлено через 1 минуту
а в деструкторе ведь. delete name;

Добавлено через 1 минуту
а что он будет удалять от vasia?

Добавлено через 21 секунду

Не по теме:

или я опять что-то не досмотрел или не так понял?

0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
18.01.2013, 23:20 #7
C++
1
2
3
4
5
6
persona::persona()
{
    name="Мазай";
    age=55;
    pol=true;
}
ответ: это ненормальный конструктор по умолчанию. Тема строковых литералов поднималась не раз на форуме, и вот: мы тоже на неё напоролись.
Вообще, наличие конструктора по умолчанию очень скользкая вещь. Иногда, если конструктор по-умолчанию отсутствует - это вызовет "полезную" ошибку компилятора, дающую нам знать, что где-то в программе создаётся не то, что нам надо. Но это лирика...
Ответ: в конструкторе persona :: persona() тоже надо выделять память под строку имени по всем правилам, а затем strcpy()-ровать

C++
1
2
3
4
5
6
7
persona::persona()
{ 
    name = new char[strlen("Мазай")+1];
    strcpy(name, "Мазай");
    age=55;
    pol=true;
}
Добавлено через 22 минуты
ещё
C++
1
2
3
4
void persona::setName(char *_name)
{
    name=_name;
}
Аналогично исправить на
C++
1
2
3
4
5
6
void persona::setName(char *_name)
{
    delete[] name;
    name = new char[strlen(_name)+1];
    strcpy(name, _name);
}
Ты уверен, что правильно понимаешь, зачем нужна функция strcpy()????
и в чём разница между name=_name; и strcpy(name, _name); ????
По-моему, ты плаваешь в указателях: повтори пожалуйста эту тему.

Добавлено через 2 минуты
А ещё тут по-хорошему не хватает конструктора копирования и оператора присвоения.
0
HERETIC
90 / 90 / 3
Регистрация: 10.10.2008
Сообщений: 607
Завершенные тесты: 1
19.01.2013, 00:06  [ТС] #8
Спасибо, когда исправил код в конструкторе и в GetName ошибка пропала.
Да действительно конструктор копирования я еще не писал. А так ли нужен оператор присвоения?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
19.01.2013, 00:15 #9
конкретно для такой функции main может и не нужен.
но если внезапно надо будет в неё добавить нечто вроде
C++
1
2
3
4
5
6
7
8
9
10
int main(){
    persona *kolia = new persona("Коля", 12, true);
    kolia->Add();
    persona *Olia = *kolia;
    persona Vasia;
    persona Vasia2=Vasia;
    Vasia2.setName("Коля");
    cout<<Vasia.GetName();
    return 0;
}
Внезапно проблемы снова возникнут
0
HERETIC
90 / 90 / 3
Регистрация: 10.10.2008
Сообщений: 607
Завершенные тесты: 1
19.01.2013, 01:10  [ТС] #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Внезапно проблемы снова возникнут
Да действительно проблемы возникли с конструктором копирования. Я написал пока так
C++
1
2
3
4
5
6
persona::persona(const persona &s)
{
    this->name=s.name;
    this->age=s.age;
    this->pol=s.pol;
}
Здесь опять ошибка с name. Что-то не догоняю как его переделать?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,021
19.01.2013, 19:08 #11
HERETIC, память выделять сначала, а потом strcpy
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2013, 19:08
Привет! Вот еще темы с ответами:

Нужен совет - C++
Последний раз прогал очень давно, уже подзабыл, нужен совет. Дан текстовый файл, в котором имеется последовательность чисел (например 2 2...

Нужен совет! - C++
Как можно сделать что бы переменную произвольного типа объявленную в одной функции, можно было использовать во всех остальных(все остальные...

Нужен совет - C++
Всем добрый день. Кто нибудь может поделиться компилятором Турбо Си++ или каким нибудь другим ...? Или подсказать где можно...

Нужен совет - C++
Вообщем написал программу, вкратце : сущ-ет класс человек, а классы менеджер, рабочий и ученый наследуют его св-ва. Нужно обратиться к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
19.01.2013, 19:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru