Перечисление в классах C ++ - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу создать систему бронирования номеров на C ++, в которой я хочу иметь один класс для членов {Администратор, Персонал, студент}, и другой класс для типов комнат {лекция, аудитория, лаборатория, ...},Вопрос в том, можно ли использовать enum для обоих классов, которые указывают его типы.И тогда в основном методе в другом классе возникнет проблема или нет?

#include <iostream>
using namespace std;


class room {

    enum roomType {

        main,
        exam,
        lecture
    };
}

// another class for members

class member {

    enum memberType {

        admin,
        staff,
        student
    };
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Хотя вы можете использовать enum для указания типа комнаты и типа участника, это не очень хороший подход.

  1. Если вам нужно добавить новые типы комнат и / или типы участниковВам нужно будет изменить классы, которые предположительно находятся в хорошем рабочем состоянии.Это нарушает принцип открытый-закрытый .

  2. Вам необходимо будет использовать логику if/else для работы с различными типами комнат и типами участников.Еще раз, когда вы добавляете новые типы комнат и / или типы участников, вам нужно будет посетить все места, где указанная логика if/else использовалась для учета новых добавленных типов.Это еще одно нарушение принципа открытый-закрытый .

    Кроме того, метод if/else имеет тенденцию к ошибкам.Легко пропустить один или два типа.

Будет лучше использовать наследование и создавать различные типы комнат и членов.

// room type and its sub-classes.

class room_t
{
}

class main_room_t : public room_t
{
};

class exam_room_t : public room_t
{
};

class lecture_room_t : public room_t
{
};

// member type and its sub-classes.

class member_t
{
};

class admin_t : public member_t 
{
};

class staff_t : public member_t 
{
};

class student_t : public member_t 
{
};

Вам понадобитсядобавить необходимые virtual функции-члены для обеспечения поведения классов.

0 голосов
/ 11 декабря 2018

Ваш код выглядит нормально (за исключением пропущенных ; после занятий).Пример использования:

#include <iostream>

class room {
public:
    enum roomType { main, exam, lecture };

    room(roomType t) : type(t) {}
private:
    roomType type;
};

// another class for members

class member {
public:
    enum memberType { admin, staff, student };

    member(memberType t) : type(t) {}
private:
    memberType type;
};

int main() {
    room r(room::lecture);
    member m(member::staff);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...