只允许特定的类“ Fabric”构造类“ Foo”及其所有子类的实例

时间:2018-10-20 07:20:03

标签: c++

有没有一种方法可以确保只有类Random random = new Random(); int rand = random.Next(1, x + 1); if (phrase.points > 0 && phrase.points < (rand + 1)) return; 可以构造类Fabric及其所有子类,而不必在每个子类中声明私有构造函数和Foo级?

friend class Fabric

由于友谊不是继承的,因此在声明每个子类时似乎都需要两个手动操作,这很容易出错。

1 个答案:

答案 0 :(得分:2)

一个选择是声明一个只能由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;
}