【发布时间】:2013-11-23 14:54:03
【问题描述】:
我有一个类House,它包含一系列类Rooms 作为成员变量。它本身没有任何孩子。
Room 是一个基类,它有几个子类 - Bedroom、Bathroom 等。
我希望能够将房间的创建限制在 House 类中。我有以下内容:
H 文件
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 文件
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,我就开始出现编译错误(“无法访问”)。如果我交换 Bedroom 和 Bathroom 构造函数的状态,则语句 (2) 将失败并且语句 (3) 在 .CPP 文件中按预期工作。但是,将它们保留为公开意味着它们仍然可以在我不想要的 House 之外创建。
我该如何解决这个问题?创建room 时我依赖多态性,因为在编译时我不知道它会是哪种类型。这是造成问题的原因吗?
【问题讨论】:
标签: c++ inheritance friend