Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅允许特定类';织物&x27;构造类'的实例;Foo';以及它的所有子类_C++ - Fatal编程技术网

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问题。@πάνταῥεῖ: 这不是要求。