C ++, как добавить дополнительную информацию в поле - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть ученик класса с единственной целочисленной переменной

class Student {
 int id;...
};

Иногда идентификатор относится к идентификатору ученика, а иногда к автоматически сгенерированному идентификатору, который совершенно не связан с идентификатором студента (возможно, у студента не былоID вообще или сделал и был проигнорирован).Проблема заключается в том, что при обработке алгоритмов учеников их поведение должно меняться в зависимости от того, был ли идентификатор получен учеником или он был создан автоматически.

Я думал о добавлении дополнительного поля (bool) для обозначения, которое есть что.Но это вызывает опасность того, что два поля не синхронизированы.

Или перечислите вместо bool.Но я чувствую, что должен быть лучший способ обозначить это более объектно-ориентированным образом.

Ответы [ 5 ]

2 голосов
/ 13 декабря 2011

Я думал о добавлении дополнительного поля (bool) для обозначения, которое есть что.Но это вызывает опасность того, что эти два поля не синхронизированы.

Это то, что скрывает данные.Если вы сделаете оба поля приватными, вы сможете контролировать их синхронизацию через общедоступные функции-члены, например,

class Student {
public:
    Student()
        :id_(rand()),
        autogen_(true)
    {}

    Student(int id)
        :id_(id),
        autogen_(false)
    {}

    void SetID(int id)
    {
        id_ = id;
        autogen_ = false;
    }

    int GetID() const { return id_; }
private:
    int id_;
    bool autogen_;
};
1 голос
/ 13 декабря 2011

Я не знаю и не очень интересуюсь теорией ООП, но вы можете закодировать информацию в виде.

// tagged_id<T1> and tagged_id<T2> are distinct types that convert to int
template <typename Tag>
struct tagged_id {
    int id;
    explicit tagged_id(int id) : id(id) {}
    operator int() const { return id; }
};

struct student {
    struct autogenerated_id;
    struct real_student_id;
    // variant is a tagged union of types — it'll either be one or the other
    boost::variant<tagged_id<autogenerated_id>, tagged_id<real_student_id>> id;
};

Вы можете прочитать Boost.Variant документы о том, как действовать с сохраненным значением.

1 голос
/ 13 декабря 2011

Я голосую за перечисление - это делает код более читабельным, чем bool, и в любом случае он, вероятно, будет занимать столько же памяти, сколько и bool, тогда вы можете расширить его, если у вас есть требование иметь третий тип идентификатора.

1 голос
/ 13 декабря 2011

Если автоматически сгенерированные числа являются только положительными, вы можете добавить отрицательный знак при назначении идентификаторов учеников. Это позволит вам различать автоматически сгенерированные и назначенные идентификаторы. А при использовании идентификаторов вы можете принять абсолютное значение.

0 голосов
/ 13 декабря 2011

Звучит так, как если бы вы могли использовать «базовый класс ученика», который определяет интерфейс того, как алгоритм обработки обрабатывает объекты ученика, а затем иметь отдельные производные классы для каждого типа идентификатора (идентификатор студента или автоматически сгенерированный), каждыйиз которых имеет соответствующую логику обработки обработки, определенную в производном классе.Это более объектно-ориентированный дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...