我有一个组件类,它定义了一般应该如何创建Component
的静态模板方法:
class Component {
protected:
uint32_t id;
Component(uint32_t id) :
id(id) {
}
template<typename T, uint32_t C>
static T* createComponent() {
// content here not relevant
return new T(someParameter);
}
};
然后有一个实现,例如Button
。不应该直接使用此类的构造函数,而是使用静态方法调用Component::createComponent
模板函数。
class Button: public Component {
protected:
Button(uint32_t id) :
Component(id) {
}
public:
static Button* create();
};
实现看起来像这样,将类型传递给实例化,并在创建中使用常量:
Button* Button::create() {
return createComponent<Button, UI_COMPONENT_BUTTON>();
}
现在的问题是,编译器抱怨&#34;错误:&#39; Button :: Button(uint32_t)&#39;受到保护&#34; 。根据我的理解,这个构造函数调用应该是正常的Button
扩展Component
,但这似乎是一个问题。
我该如何解决这个问题?
答案 0 :(得分:4)
由于您的create()
函数无法处理其他继承的类,您可以利用此功能而不创建Button
,而是通用派生,受保护,派生类,可以访问您的protected
构造函数:
class Component {
uint32_t id;
template <typename T>
struct Concrete: T {
Concrete(uint32_t id): T(id) {}
};
protected:
Component(uint32_t id) :
id(id) {
}
template<typename T, uint32_t C>
static T* createComponent() {
// content here not relevant
return new Concrete<T>(C);
}
};
class Button:
public Component {
protected:
Button(uint32_t id): Component(id) {}
public:
static Button* create() {
return createComponent<Button, UI_COMPONENT_BUTTON>();
}
};
答案 1 :(得分:2)
Button构造函数的访问说明符受到保护,这意味着它只能由派生自Button的类访问。如果您希望代码工作,那么您必须将该构造函数设为公共。
答案 2 :(得分:0)
“Button”扩展“Component”,因此“Button”可以访问“Component”的受保护成员,但“Component”不知道“Button”,因此无法访问受保护的成员。