问题是自我解释,但如果需要,这是一个例子:
说我有一个课程'事情'使用私有构造函数,即具有函数的朋友' 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的朋友,这是有道理的。
那么关于友谊如何赋予朋友函数中定义的结构/类的规则是什么?
答案 0 :(得分:3)
这是本地课程标准部分的第一段:
可以在函数定义中声明类;这样的类叫做本地类。本地类的名称是其封闭范围的本地名称。本地类在封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。