如何在友方函数中定义的类中赋予友谊?

时间:2015-02-26 02:27:30

标签: c++ language-lawyer

问题是自我解释,但如果需要,这是一个例子:

说我有一个课程'事情'使用私有构造函数,即具有函数的朋友' make_thing':

class Thing
{
    friend std::shared_ptr<Thing> make_thing();

    Thing()
    {
        std::cout << "Thing constructor" << std::endl;
    }
};

&#39; make_thing&#39; function里面定义了一个struct:

std::shared_ptr<Thing> make_thing()
{
    // err: Thing::Thing() is private within make_shared
    // auto thing = std::make_shared<Thing>();

    // this is okay
    struct AccessThing : public Thing {
        AccessThing() : Thing() { }
    };

    auto thing = std::make_shared<AccessThing>();
    return thing;
}

这可以在gcc 4.8.2,clang 3.5和msvc 2013中编译和工作。我无法调用

make_shared<Thing>()

因为Thing有一个私有构造函数。但是,我可以通过创建一个带有公共构造函数的结构(AccessThing)来解决这个问题,而公共构造函数又调用Thing的私有构造函数,然后将其传递给make_shared。对我而言,如果AccessThing是Thing的朋友,这是有道理的。

那么关于友谊如何赋予朋友函数中定义的结构/类的规则是什么?

1 个答案:

答案 0 :(得分:3)

这是本地课程标准部分的第一段:

  

可以在函数定义中声明类;这样的类叫做本地类。本地类的名​​称是其封闭范围的本地名称。本地类在封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。