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

Работа с конструктором - C++

Восстановить пароль Регистрация
 
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
12.03.2013, 19:40     Работа с конструктором #1
Всем доброго времени суток.

Получил задание по программированию в универе. Писать задание за меня не прошу, нужно лишь уяснить парочку моментов. В общем-с, необходимо создать класс Person с одним единственным полем типа сhаr *, в котором можно хранить имя и которое можно проинициализировать только через конструктор Person(char const *). Препод сказал, что внутри конструктора должен использоваться аллокатор new, для выделения памяти. Вот тут то я и застрял. Первая проблема в том, что поле имеет тип char*, а аргумент конструктора - char const*. Вторая проблема - это выделение нужного объема памяти. Если бы нужно было выделять ее через malloc(), то тут не было бы проблем, а вот c new я плохо знаком. Прошу помочь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
class Person
{
private:
    char *name;
 
public:
    Person(char const *n)
    {    
         // ???
    }
 
};
 
int main()
{
    Person p1 = "cyberforum";
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
12.03.2013, 19:43     Работа с конструктором #2
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
#include <iostream>
using namespace std;
 
class Person
{
private:
    char *name;
 
public:
    Person(char const *s)
    {    
         name = new char[strlen(s) + 1];
         strcpy(name,s);
    }
    ~Person()
    {
        delete [] name;
    }
 
};
 
int main()
{
    Person p1("cyberforum");
 
    return 0;
}
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
12.03.2013, 21:34  [ТС]     Работа с конструктором #3
Why so seriouS,
Спасибо, все понял)

Странно, почему я не могу нажать "Спасибо" под твоим постом? Этой ссылки просто нет
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
12.03.2013, 22:28     Работа с конструктором #4
Цитата Сообщение от murtukov Посмотреть сообщение
Странно, почему я не могу нажать "Спасибо" под твоим постом?
Я только сегодня зарегистрировался, еще не могу иметь репутацию
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
13.03.2013, 01:52  [ТС]     Работа с конструктором #5
Why so seriouS, ну, как появится возможность, обязательно отправлю)

Кстати, возник еще вопрос. Вот допустим я хочу добавить в класс Person метод, с помощью которого можно считывать сохраненное имя name извне, но при этом, чтобы его нельзя было изменить. Как можно это реализовать?
Humble_Beck
15 / 15 / 1
Регистрация: 10.03.2013
Сообщений: 54
13.03.2013, 01:58     Работа с конструктором #6
Можно так:
C++
1
2
3
char* getName(){
        return name;
    }
и имя Вы никак не поменяете так как оно private
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
13.03.2013, 02:17  [ТС]     Работа с конструктором #7
Цитата Сообщение от Humble_Beck Посмотреть сообщение
Можно так:
Код C++
1
2
3
char* getName(){
return name;
}
и имя Вы никак не поменяете так как оно private
Почему же не поменяю? Поменяю)
Вот:

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 <cstring>
using namespace std;
 
class Person
{
private:
    char *name;
 
public:
    Person(char const *s)
    {
         name = new char[strlen(s) + 1];
         strcpy(name,s);
    }
    ~Person()
    {
        delete [] name;
    }
 
    char * getArr()
    {
        return name;
    }
};
 
int main()
{
    Person p1("cyberforum");
 
    char * ptr = p1.getArr();
 
    cout << ptr << endl;
 
    ptr[0] = 'k';
 
    cout << p1.getArr(); // первая буква изменилась
 
    return 0;
}
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
13.03.2013, 18:40     Работа с конструктором #8
Цитата Сообщение от murtukov Посмотреть сообщение
но при этом, чтобы его нельзя было изменить.
Можно создать копию name и возвращать указатель не на name а на копию:
C++
1
2
3
4
5
6
char * getArr()
    {
        char* ptr = new char[strlen(name) + 1];
        strcpy(ptr,name);
        return ptr;
    }
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
13.03.2013, 19:55  [ТС]     Работа с конструктором #9
Why so seriouS,

Но ведь тогда будет утечка памяти, если я буду несколько раз вызывать метод getArr()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 20:00     Работа с конструктором
Еще ссылки по теме:

Что-то с конструктором C++
C++ Трабла с конструктором
C++ Непонятки с конструктором копирования

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.03.2013, 20:00     Работа с конструктором #10
C++
1
const char *getArr() const;
Yandex
Объявления
13.03.2013, 20:00     Работа с конструктором
Ответ Создать тему
Опции темы

Текущее время: 04:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru