C++ 仅允许特定类';织物&x27;构造类'的实例;Foo';以及它的所有子类
有没有办法确保只有类C++ 仅允许特定类';织物&x27;构造类'的实例;Foo';以及它的所有子类,c++,C++,有没有办法确保只有类Fabric可以构造类Foo及其所有子类,而不必在每个子类中声明私有构造函数和友元类Fabric struct Foo { friend class Fabric; protected: Foo() = default; }; struct FooConcrete1 : Foo { friend class Fabric; protected: Foo() = default; }; 由于友谊不是继承的,所以在声明每个子类时似乎都需要手动操作,这很
Fabric
可以构造类Foo
及其所有子类,而不必在每个子类中声明私有构造函数和友元类Fabric
struct Foo {
friend class Fabric;
protected:
Foo() = default;
};
struct FooConcrete1 : Foo {
friend class Fabric;
protected:
Foo() = default;
};
由于友谊不是继承的,所以在声明每个子类时似乎都需要手动操作,这很容易出错。一个选项是声明只能由
Fabric
构造的标记结构,并将此对象传递给Foo
的构造函数。如果忘记将构造函数添加到派生类中,则会出现一个错误,Foo
不是默认可构造的
struct FooTag
{
friend struct Fabric;
private:
FooTag();
};
struct Foo {
Foo(FooTag tag) {}
};
struct FooConcrete1 : Foo {
using Foo::Foo;
};
struct Fabric
{
void test()
{
FooConcrete1 f = FooConcrete1(FooTag());
}
};
int main()
{
FooConcrete1 f; // can't construct as we can't construct FooTag
return 0;
}
可以限制
Foo
的构造函数将对Fabric
的引用作为构造函数参数。@πάνταῥεῖ: 嗯,聪明!这使得编译器确保了构造规则,但在每个子类中仍然需要人工。这不会禁止Fabric
的子类构造任何Foo
实例tho:-/为什么需要它?这似乎是一个X-Y问题。@πάνταῥεῖ: 这不是要求。