请考虑以下示例。
class Parent
{
public:
Child createChild();
// some member data and functions can go here.
}
class Child: public Parent
{
// some member data and functions can go here.
}
我想只允许通过Parent类中提供的方法创建“Child”类。那就是我想拒绝用户实例化Child类对象的选项。我还想避免使用Child类的所有其他默认构造。 怎么可能?
Parent p;
Child c = p.createChild(); // should be possible
Child d; //should not be allowed
Child e = c; // may be allowed
答案 0 :(得分:5)
您可以制作Child
构造函数private
,Parent::createChild
为friend
Child
。
请注意the comment by StoryTeller,因为您的复制构造函数仍需要公开。
答案 1 :(得分:0)
你可以这样做。
class Parent
{
public:
static Parent* InstantiateParent(); // for completeness' sake
static Child* InstantiateChild();
};
class Child : public Parent
{
Child();
Child(Child& other):
Child& operator = (Child& other);
friend class Parent;
public:
};
/* impl.cpp */
#include "header.hpp";
Child* Parent::InstantiateChild()
{
return new Child;
}
Parent* Parent::InstantiateParent()
{
return new Parent;
}
虽然通过工厂模式的某些变化将创作与目标类分开有其自身的优势。
答案 2 :(得分:0)
你可以让CreateChild()返回除Child之外的其他东西,它可以公开移动构造给Child。你为移动买单,因为它没有复制,并且代码是冗余的c ++ 17。
你是否可以接受对临时的const或正确的引用,这会延长它的寿命?我认为在任何情况下它都不会与直接创建的不可复制对象具有相同的生命周期。