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

клас Letter, клас Person - C++

Восстановить пароль Регистрация
 
MrRuslanBB
4 / 4 / 0
Регистрация: 02.04.2012
Сообщений: 274
04.06.2013, 21:15     клас Letter, клас Person #1
Створити клас Letter, що мiстить наступнi елементи:
- поле «вiдправник» Person*Sender;
- поле «одержувач» Person*Receiver;
- поле «адреса» char*Address;
- метод вiдправлення листа int Send(); (якщо хоча б одне поле не заповнене, то noвiдомиmи про помилку - повернути 1, iнакше 0);
- метод одержания адресноi iнформацii (ПIБ+ПIБ+адреса) char*Getlnfo();
- конструктор з параметрами Letter(Person*sender, Person*receiver, char*Address);

У клaci Letter перевантажити оператор! (унарний, оператор класу), нова дiя - повернути адреса.

Створити клас Person, що мiстить наступнi елементи:
- ноле «iм'я» char*FirstName;
- поле «призвище» char*LastName;
- поле «по батьковi char*Otchestvo;
- метод одержання ПIБ char*GetFIO();
- конструктор з параметрами Person(char*FirstName, char*LastName, char*Otchestvo);

Класс letter, чёт не хочет он работать) Подскажиет в чём дело люди умные...

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
struct Person
{
    char firstname[80];
    char lastname[80];
};
 
class Letter {
    Person* sender;
    Person* receiver;
    char    adress[80];
public:
    Letter()
    {
        sender = 0;
        receiver = 0;
        strcpy(adress, "");
    }
    Letter(Person* s, Person *r, char *adr)
    {
        sender = s;
        receiver = r;
        strcpy(adress, adr);
    }
 
    char* GetInfo()
    {
        char temp[240];
        temp[0] = '\0';
        strcat(temp,sender->firstname);
        strcat(temp," ");
        strcat(temp,sender->lastname);
        strcat(temp,"   ");
        strcat(temp,receiver->firstname);
        strcat(temp," ");
        strcat(temp,receiver->lastname);
        strcat(temp,"   ");
        strcat(temp,adress);
        return temp;
    }
 
    int Send()
    {
        if(sender == 0 || receiver == 0 || strcmp(adress,"") == 0)
            return 1;
 
        //Отправление письма, куда ?
 
        return 0;
    }
};
 
int main()
{
    Person p1,p2;
    strcpy(p1.firstname,"Ivanov");
    strcpy(p1.lastname,"Petr");
 
    strcpy(p2.firstname,"Petrov");
    strcpy(p2.lastname,"Ivan");
 
    Letter l1,l2(&p1,&p2,"Gagarina, 16");
 
    printf("%d\n%d\n",l1.Send(),l2.Send());
    printf("%s\n",l2.GetInfo());
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2013, 21:15     клас Letter, клас Person
Посмотрите здесь:

клас обработчик C++
C++ создать клас HugeInt
C++ Векторы+клас
C++ матрица. клас
C++ матрица. клас. 2
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
04.06.2013, 21:48     клас Letter, клас Person #2
Как понять "не хочет работать"?
MrRuslanBB
4 / 4 / 0
Регистрация: 02.04.2012
Сообщений: 274
04.06.2013, 22:05  [ТС]     клас Letter, клас Person #3
Да 2 ошибочки выдает... на данный момент, а как дальше себя поведет, даже не знаю...


1>c:\users\руслан\documents\visual studio 2012\projects\consoleapplication3\consoleapplication3\практика.cpp(18): 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.


1>c:\users\руслан\documents\visual studio 2012\projects\consoleapplication3\consoleapplication3\практика.cpp(40): warning C4172: возвращение адреса локальной или временной переменной
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
04.06.2013, 22:12     клас Letter, клас Person #4
Первый это CRT варнинг (почитаете что это) можете опустить его.

Второй это "хороший" варнинг, он вам показал Вашу ошибку, дело в том что при выходе из функции GetInfo()
переменная temp удалиться (почитайте про область видимости переменных, настоятельно рекомендую), и указатель указывающий на нее будет не валиден. Если следовать Вашему стилю программирования, то нужно завести еще один мембер класса char *info и в перегруженном конструкторе инициализировать этот мембер, соответственно GetInfo() вернуть info.

Если же следовать еще и здравому смыслу, то нужно вернуть не char*, а const char* const.
MrRuslanBB
4 / 4 / 0
Регистрация: 02.04.2012
Сообщений: 274
04.06.2013, 22:44  [ТС]     клас Letter, клас Person #5
Цитата Сообщение от stima Посмотреть сообщение
Первый это CRT варнинг (почитаете что это) можете опустить его.

Второй это "хороший" варнинг, он вам показал Вашу ошибку, дело в том что при выходе из функции GetInfo()
переменная temp удалиться (почитайте про область видимости переменных, настоятельно рекомендую), и указатель указывающий на нее будет не валиден. Если следовать Вашему стилю программирования, то нужно завести еще один мембер класса char *info и в перегруженном конструкторе инициализировать этот мембер, соответственно GetInfo() вернуть info.

Если же следовать еще и здравому смыслу, то нужно вернуть не char*, а const char* const.
Эх если бы это мой код был)) я пока ещё не дорос до такого уровня и не знаю задамся ли целью расти, пока лишь годовую оценку цель получить) вот уже последняя программа осталась)) + базу данных создать, несколько экзаменов и на каникулы)

А вот по теме, изменил немного код, по подсказки, что вы дали... правильно хоть сделал?


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
#include <iostream>
#include <string.h>
 
 
struct Person {
    char firstname[80];
    char lastname[80];
};
 
class Letter {
    Person*sender;
    Person*receiver;
    char*info;
    char*adress;
 
public:
    Letter() {
        sender=0;
        receiver=0;
        strcpy(adress, "");
    }
 
Letter(Person* s, Person *r, char*adr) {
    sender = s;
    receiver = r;
    strcpy(adress, adr);
}
 
char*GetInfo() {
char temp[240];
        
temp[0] = '\0';
strcat(temp,sender->firstname);
strcat(temp," ");
strcat(temp,sender->lastname);
strcat(temp,"   ");
strcat(temp,receiver->firstname);
strcat(temp," ");
strcat(temp,receiver->lastname);
strcat(temp,"   ");
strcat(temp,adress);
return info;
}
 
int Send() {
    if(sender == 0 || receiver == 0 || strcmp(adress,"") == 0)
        return 1;
    else printf("Письмо отправлено!");
        return 0;
    }
};
 
int main() {
    Person p1,p2;
    strcpy(p1.firstname,"Ivanov");
    strcpy(p1.lastname,"Petr");
 
    strcpy(p2.firstname,"Petrov");
    strcpy(p2.lastname,"Ivan");
 
    Letter l1,l2(&p1,&p2,"Gagarina, 16");
 
    printf("%d\n%d\n",l1.Send(),l2.Send());
    printf("%s\n",l2.GetInfo());
 
    return 0;
}

Насчёт этого я так и не понял нечего??

1>c:\users\руслан\documents\visual studio 2012\projects\consoleapplication3\consoleapplication3\практика.cpp(20): 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.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
05.06.2013, 00:05     клас Letter, клас Person #6
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <cstring>
#include <iostream>
 
class Person {
 
public:
    Person(const char* first_name, const char* last_name)
    {
        mp_first_name = new char[strlen(first_name) + 1]();
        mp_last_name  = new char[strlen(last_name) + 1]();
 
        strcpy(mp_first_name, first_name);
        strcpy(mp_last_name, last_name);
    }
 
    ~Person()
    {
        delete[] mp_first_name;
        delete[] mp_last_name;
    }
 
    const char* const first_name() const { return mp_first_name; }
    const char* const last_name() const { return mp_last_name; }
 
private:
    char* mp_first_name;
    char* mp_last_name;
};
 
class Letter {
 
public:
    Letter()
        : mp_sender(0), mp_receiver(0), mp_address(0) {}
 
    Letter(const Person* sender, const Person *resiver, char *adrr)
        : mp_sender(sender), mp_receiver(resiver)
    {
        mp_address = new char[strlen(adrr) + 1]();
        strcpy(mp_address, adrr);
 
        _make_info();
    }
 
    ~Letter()
    {
        delete[] mp_address;
        delete[] mp_info; 
    }
 
    const char* const get_info() const { return mp_info; }
 
    int send() const
    {
        return mp_sender == NULL || mp_receiver == NULL || mp_address == NULL ? 1 : 0; //c++ style int -> bool conv
    }
 
private:
    const Person* mp_sender;
    const Person* mp_receiver;
 
    char* mp_info;
    char* mp_address;
 
    void _make_info()
    {
        int offset = 0, len = 0;
        char temp[1000 + 1]; //forse allocation
 
        offset += _memcpy(temp + offset, "Sender: ");
        offset += _memcpy(temp + offset, mp_sender->first_name());
        offset += _memcpy(temp + offset, " ");
        offset += _memcpy(temp + offset, mp_sender->last_name());
        offset += _memcpy(temp + offset, "\n");
 
        offset += _memcpy(temp + offset, "Receiver: ");
        offset += _memcpy(temp + offset, mp_receiver->first_name());
        offset += _memcpy(temp + offset, " ");
        offset += _memcpy(temp + offset, mp_receiver->last_name());
        offset += _memcpy(temp + offset, "\n");
 
        offset += _memcpy(temp + offset, "Address: ");
        offset += _memcpy(temp + offset, mp_address);
        temp[offset] = 0; //null terminant
        
        mp_info = new char[offset + 1];
        strcpy(mp_info, temp);
    }
 
    int _memcpy(char* dest, const char* src)
    {
        int len = strlen(src);
        memcpy(dest, src, len);
 
        return len;
    }
};
 
int main()
{
    Person p1("Ivanov", "Petr");
    Person p2("Petrov", "Ivan");
 
    Letter letter(&p1,&p2,"Gagarina, 16");
    std::cout << "Letter" << (letter.send() == 0 ? " was " : " wasnt ") << "sended" << std::endl;
    std::cout << letter.get_info() << std::endl;
 
    return 0;
}
Добавлено через 12 минут
п.с. Если уж совсем по феншую, то еще деструкторы виртуалны или класс файнал.
MrRuslanBB
4 / 4 / 0
Регистрация: 02.04.2012
Сообщений: 274
05.06.2013, 00:11  [ТС]     клас Letter, клас Person #7
Вот где есть strcpy выдаёт ошибку

1>c:\users\руслан\documents\visual studio 2012\projects\consoleapplication3\consoleapplication3\практика.cpp(40): 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.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
05.06.2013, 00:13     клас Letter, клас Person #8
Это не ошибка это предупреждение. Я Вам уже говорил почитайте, что именно оно значит. Если кратко, то Майкрософт утверждает что std-шная реализация strcpy небезопасна и предлагает использовать реализацию от Майкрософт stcpy_s.
MrRuslanBB
4 / 4 / 0
Регистрация: 02.04.2012
Сообщений: 274
05.06.2013, 00:25  [ТС]     клас Letter, клас Person #9
А как отключить это предупреждение или где прочитать о нём?... когда в гугле забиваю- куча инфы выдает разной... непойму за что хвататься...
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
05.06.2013, 00:58     клас Letter, клас Person #10
первая же ссылка в гугле мне выдает этот форум.
Как отключить _CRT_SECURE_NO_WARNINGS?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 01:15     клас Letter, клас Person
Еще ссылки по теме:

переделать клас C++
C++ клас myDate
клас птиц C++

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

Или воспользуйтесь поиском по форуму:
MrRuslanBB
4 / 4 / 0
Регистрация: 02.04.2012
Сообщений: 274
05.06.2013, 01:15  [ТС]     клас Letter, клас Person #11
Цитата Сообщение от stima Посмотреть сообщение
первая же ссылка в гугле мне выдает этот форум.
Как отключить _CRT_SECURE_NO_WARNINGS?
Фух... спасибо вам добрый человек, ещё отчёт сделать и пол месяца учёбы и уйду на последние 2 месяца каникул перед последним курсом колледжа и началом рабочей жизни(
Yandex
Объявления
05.06.2013, 01:15     клас Letter, клас Person
Ответ Создать тему
Опции темы

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