C ++: ограничение создания экземпляров объектов с помощью классов-друзей

0

У меня есть класс, House, который содержит выбор классов, Room s, в качестве переменных-членов. У нее нет детей.

Номер является базовым классом, и в нем есть несколько детских классов - спальня, ванная комната и т.д.

Я хочу, чтобы иметь возможность ограничивать создание комнат только внутри класса House. У меня есть следующее:

H FILE

class house
{
public:
    house(/* constructor arguments */);
    ~house(void);
public:
    // generic member variables - length, width, floors, colour, etc.
    room  *room1;
     friend class room;
    friend class bedroom;
    friend class bathroom;
}
 class room
{
protected:                 // this compiles as PROTECTED or PUBLIC
    room(/* constructor arguments */);
public:
    virtual ~room(void);
/* generic member variables - length, width, floor, door, etc. */
}
 class bedroom : public room
{
public:                    // this compiles as PUBLIC only
    bedroom(/* constructor arguments */);
public:
    ~bedroom(void);
/* specific variables - hasBed, hasWardrobe, etc. */
}
 class bathroom : public room
{
protected:                 // this compiles as PUBLIC only
    bathroom(/* constructor arguments */);
public:
    ~bathroom(void);
/* yet more specific variables */
}

CPP FILE

house::house (/* constructor arguments */)
{
/* do stuff */

    room = new(nothrow) room(/*agrs*/)      // (1) COMPILES WITH THIS
    room = new(nothrow) bedroom(/*agrs*/)   // (2) COMPILES WITH THIS
    room = new(nothrow) bathroom(/*args*/)  // (3) DOES NOT COMPILE
}

house::~house(void) { /* clean up + delete */ }

room::room (/* constructor arguments */)
{ /* do stuff */ }
room::~room(void) { /* clean up */ }

bedroom::bedroom (/* constructor arguments */): room(/* constructor arguments */)
{ /* do stuff */ }
bedroom::~bedroom(void) { /* clean up */ }

bathroom::bathroom(/* constructor arguments */): room(/* constructor arguments */)
{ /* do stuff */ }
bathroom::~bathroom(void) { /* clean up */ }

Программа компилируется и успешно запускается без защищенных конструкторов, но комнаты могут быть созданы волей-неволей из любого места. Как только я переключаю Room и его дочерние конструкторы на PROTECTED, я начинаю получать ошибки компиляции ("недоступно"). Если я поменяю статус конструкторов спальни и ванной, тогда оператор (2) не сработает, и утверждения (3) будут работать в файле.CPP, как ожидается. Однако, оставляя либо общественными средствами, они все еще могут быть созданы за пределами House чего я не хочу.

Как мне обойти это? Я полагаюсь на полиморфизм при создании room потому что во время компиляции я не знаю, какой тип он будет. Это вызывает проблему?

Теги:
inheritance
friend

2 ответа

3
Лучший ответ

Дружба в C++ - это альтруистическая концепция, а не эгоистическая.

Класс может объявлять друзей. Это не означает, что класс может получить доступ к защищенным и частным членам друга. Друг может получить доступ к защищенным и закрытым членам объявляющего класса.

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

  • 0
    Красиво сказано, спасибо. У меня были неправильные отношения.
1

Вы можете использовать отношения "друг":

class Room {
  friend class House;
  // ...

Затем дом будет иметь доступ к частным (и защищенным) членам комнаты. Действительно ли это полезно для обсуждения: я очень редко использую friend и предлагаю, чтобы в этом случае это не было необходимо: в конце концов, какой вред в создании комнаты?

  • 0
    т. е. OP дружит не так.
  • 0
    В этом примере это может не понадобиться, поскольку я сократил его для краткости. Если House конечном итоге становится базовым классом со своими собственными детьми, то может случиться так, что некоторым из производных классов не разрешается создавать определенные room .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню