Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.07.2012
Сообщений: 23
1

Описать класс Друг

02.09.2012, 15:35. Показов 1857. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно описать класс Друг.Данные класса имя,номер телефона,важность знакомства.
Методы должны обеспечить минимальную функциональность объекта
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2012, 15:35
Ответы с готовыми решениями:

Разработать класс Man (человек) и производный класс Student (студент). Описать атрибуты.
Разработать класс Man (человек) и производный класс Student (студент). Описать атрибуты.

Разработать класс Tableware (посуда) и производный класс Dish (тарелка). Описать атрибуты
Разработать класс Tableware (посуда) и производный класс Dish (тарелка). Описать атрибуты.

Класс - друг
Всем доброго дня !!! Столкнулся с проблемой при обьявлении класса Dasa другом класса Da. В...

Класс-друг
#include <iostream> using namespace std; class first { public: friend second; private:...

20
163 / 163 / 68
Регистрация: 23.02.2011
Сообщений: 392
02.09.2012, 16:22 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Friend {
public:
    Friend(std::string _name = "", std::string _phoneNumb = "", int _imp = 0) :
        name(_name), phoneNumb(_phoneNumb), imp(_imp) {}
    void set_name(const std::string& _name) {
        name = _name;
    }
    std::string get_name() const {
        return name;
    }
    // и по 2 пары таких же методов с другими полями
private:
   std::string name;
   std::string phoneNumb;
   int imp;
};
1
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
02.09.2012, 16:24 3
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
//Friend.h:
#ifndef FRIEND_H
#define FRIEND_H
 
    class Friend {
        char* name;
        char* phone;
        short prio;
    public:
        Friend(const char name[ ] = "", const char phone[ ] = "", short prio = 0);
        Friend(const Friend&);
        ~Friend();
        Friend& operator=(const Friend&);
        bool operator==(const Friend&) const;
        bool operator!=(const Friend& f) const { return !(*this == f); }
        const char* GetName() const { return name; }
        char* SetName(const char[ ]);
        const char* GetPhone() const { return phone; }
        char* SetPhone();
        short GetPrio() const { return prio; }
        short SetPrio(short p) { return prio = p; }
    };
 
#endif
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
//Friend.cpp:
#include <cstring>
#include "Friend.h"
 
Friend::Friend(const char nm[ ], const char ph[ ], short p) {
    name = new char[strlen(nm) + 1];
    phone = new char[strlen(ph) + 1];
    strcpy(name, nm);
    strcpy(phone, ph);
    prio = p;
}
 
Friend::Friend(const Friend& f): Friend(f.name, f.phone, f.prio) { }
 
Friend::~Friend() {
    delete[ ] name;
    delete[ ] phone;
}
 
Friend& Friend::operator=(const Friend& f) {
    delete[ ] name;
    delete[ ] phone;
    name = new char[strlen(f.name) + 1];
    phone = new char[strlen(f.phone) + 1];
    strcpy(name, f.name);
    strcpy(phone, f.phone);
    prio = f.prio;
    return *this;
}
 
bool Friend::operator==(const Friend& f) const {
    return prio == f.prio && !strcmp(name, f.name) && !strcmp(phone, f.phone);
}
 
char* Friend::SetName(const char nm[ ]) {
    delete[ ] name;
    name = new char[strlen(nm) + 1];
    strcpy(name, nm);
}
 
char* Friend::SetPhone(const char ph[ ]) {
    delete[ ] phone;
    phone = new char[strlen(ph) + 1];
    strcpy(phone, ph);
}
1
0 / 0 / 0
Регистрация: 28.07.2012
Сообщений: 23
02.09.2012, 16:41  [ТС] 4
и потом еще в main создавать объекты и просто обратиться к методам?

Добавлено через 21 секунду
Спасибо большое!

Добавлено через 2 минуты
Если есть возможность, добавьте пожалуйста комментарии.Особенно где указатели
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
02.09.2012, 16:42 5
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include "Friend.h"
 
int main() {
    Friend f1 = "Alex";
    Friend f2("John", "52-70-81");
    Friend f3 = Friend("James", "12-34-56", 5);
    cout << f1.GetName() << ' ' << f2.GetName() << ' ' << f3.GetName();
}
1
0 / 0 / 0
Регистрация: 28.07.2012
Сообщений: 23
02.09.2012, 16:45  [ТС] 6
Кот Ангенс, если честно совсем не понимаю <iostream> и cout << f1.GetName() << ' ' << f2.GetName() << ' ' << f3.GetName();
чем это можно заменить?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.09.2012, 16:48 7
RosyRose, Плюсы изучать. Зачем это чем-то заменять, если вы пишите на С++, а это - вывод на С++?
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
02.09.2012, 16:50 8
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
//Friend.h:
#ifndef FRIEND_H
#define FRIEND_H
 
    class Friend {
        char* name;
        char* phone;
        short prio;
    public:
        //Конструктор по умолчанию
        Friend(const char name[ ] = "", const char phone[ ] = "", short prio = 0);
        //Конструктор копирования
        Friend(const Friend&);
        //Деструктор
        ~Friend();
        //Оператор присваивания
        Friend& operator=(const Friend&);
        //Компараторы
        bool operator==(const Friend&) const;
        bool operator!=(const Friend& f) const { return !(*this == f); }
        //Свойства
        const char* GetName() const { return name; }
        char* SetName(const char[ ]);
        const char* GetPhone() const { return phone; }
        char* SetPhone();
        short GetPrio() const { return prio; }
        short SetPrio(short p) { return prio = p; }
    };
 
#endif
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
//Friend.cpp:
#include <cstring>
#include "Friend.h"
 
Friend::Friend(const char nm[ ], const char ph[ ], short p) {
    //Выделяем память и копируем
    name = new char[strlen(nm) + 1];
    phone = new char[strlen(ph) + 1];
    strcpy(name, nm);
    strcpy(phone, ph);
    prio = p;
}
 
//Перенаправление на другой конструктор
Friend::Friend(const Friend& f): Friend(f.name, f.phone, f.prio) { }
 
Friend::~Friend() {
    //Освобождаем память
    delete[ ] name;
    delete[ ] phone;
}
 
Friend& Friend::operator=(const Friend& f) {
    //Тут все интуитивно понятно
    SetName(f.name);
    SetPhone(f.phone);
    SetPrio(f.prio);
    return *this;
}
 
bool Friend::operator==(const Friend& f) const {
    //Объекты равны, если у них одинаковый приоритет, а также совпадают имена и телефоны
    return prio == f.prio && !strcmp(name, f.name) && !strcmp(phone, f.phone);
}
 
char* Friend::SetName(const char nm[ ]) {
    //Освобождаем память, которую занимала предыдущая строка
    delete[ ] name;
    //Выделяем под размер новой и копируем
    name = new char[strlen(nm) + 1];
    strcpy(name, nm);
}
 
char* Friend::SetPhone(const char ph[ ]) {
    //То же самое
    delete[ ] phone;
    phone = new char[strlen(ph) + 1];
    strcpy(phone, ph);
}
Цитата Сообщение от RosyRose Посмотреть сообщение
чем это можно заменить?
Это же стандартная библиотека ввода/вывода C++. Можно, конечно, использовать Сишные функции:
C++
1
2
3
4
5
6
7
8
9
10
//main.cpp:
#include <cstdio>
#include "Friend.h"
 
int main() {
    Friend f1 = "Alex";
    Friend f2("John", "58-70-81");
    Friend f3 = Friend("James", "12-34-56", 5);
    printf("%s %s %s", f1.GetName(), f2.GetName(), f3.GetName());
}
1
0 / 0 / 0
Регистрация: 28.07.2012
Сообщений: 23
02.09.2012, 17:09  [ТС] 9
Спасибо за подробный ответ!
В универе изучаем С++ один семестр, и еще не объясняли такой вывод. Я его пыталась сама освоить, но пока не очень получается.
Мы всегда пишем так как написал Кот Ангенс в последнем сообщении.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
02.09.2012, 17:23 10
Кот Ангенс, по мойму нелепо друзей клонировать .
получаются друзья с одинаковым номером телефона и именем .
Вообще бы запретил копирование и присваивание:
C++
1
2
3
private:
        Friend& operator=(const Friend&);
        Friend (const Friend&);

Не по теме:


хотя в жизни мне бы пригодилось :D

0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2012, 17:33 11
... и заменил бы int priority на enum:
C++
1
2
3
4
5
6
7
8
9
10
11
class Friend {
public:
  enum {
    BuchaliVmesteKogdato = 0,
    KuritNa4inali,
    SideliSaOdnojPartoj,
    SanjatDeneg,
    VstavitZuby
    ...
    } Priority;
...
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
02.09.2012, 17:44 12
MrCold, если внутри класса идет динамическое расределение памяти, должен быть определен конструктор копирования, оператор присваивания и, само собой, деструктор.
novi4ok, prio - short, так что ты спокойно можешь записывать туда свои enum'ы, если их не больше 1016.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.09.2012, 17:47 13
Кот Ангенс, Зачем это конструктор копии и оператор присваивания должны быть определены? Их вполне можно поместить в закрытую секцию и не определять, чтобы запретить копирование и присваивание (ну или использовать delete, если соответствовать новому стандарту).
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
02.09.2012, 17:49 14
Нет копирования и присваивания , а значит и динамическое расределение памяти никак не влияет
на ситуацию.
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
03.09.2012, 11:31 15
ForEveR, а если кто-нибудь захочет создать стек друзей?
0
castaway
03.09.2012, 11:42
  #16

Не по теме:

Поправка:

Цитата Сообщение от Кот Ангенс Посмотреть сообщение
если их не больше 1016
216

1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.09.2012, 12:09 17
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
novi4ok, prio - short, так что ты спокойно можешь записывать туда свои enum'ы, если их не больше 1016.
причем здесь сколько их? городам и улицам не зря присваивают названия, а не дают номера (почтовые индексы и 5-я авеню не в счет). "друг с приоритетом 1000000000 - это непонятно, что за друг. а VstavitZuby сразу все проясняет.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.09.2012, 12:34 18
Кот Ангенс, Если с С++11 то запросто, если нет - то нужен конструктор копии
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
03.09.2012, 12:59 19

Не по теме:

Цитата Сообщение от lazybiz Посмотреть сообщение
216
Да, ошибся.


ForEveR, будет происходить выделение памяти с копированием содержимого или тупо копирование указателей?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.09.2012, 13:57 20
Кот Ангенс, move конструктор будет зваться (если он конечно есть).

http://liveworkspace.org/code/... 73f22b8919
0
03.09.2012, 13:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.09.2012, 13:57
Помогаю со студенческими работами здесь

Класс - друг. Доступ к полям и методам
Есть два класса: MainWindow и LBM_computation, в одном из них происходят вычисления. Класс...

Описать базовый класс Point. Описать класс Прямоугольник от класса Point
Описать базовый класс Point - точка. Описать класс &quot;прямоугольник&quot;. Обязательные поля класса...

Класс: Описать класс Points, затем производный от него Circle
Задание: Описать класс Points, затем производный от него Circle. Создать динамический массив...

Описать базовый класс колоды карт и производный класс пасьянс
Здраствуйте! товарищи-программисты, помогите пожалуйста со следующим заданием: Создать колоду...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru