c++ - 朋友声明的对面
问题描述
假设我们有一个具有私有构造函数的类,通过friend
我们可以允许某些特定的类仍然创建该类的对象:
class Foo
{
friend class Bar;
private:
Foo();
};
class Bar
{
Bar()
{
//create a Foo object
}
};
现在,如果我想要相反的friend
,Foo
看起来像这样:
class Foo
{
//enemy/foe??? class Bar; (if only)
public:
Foo();
};
然后没有方法Bar
可以访问Foo
构造函数/创建对象,Foo
但其他类可以(因为它是public
)。
class Bar
{
Bar()
{
Foo foo; //compiler error
}
};
这样的构造可能吗,还是我坚持保持Foo
私密并为所有课程添加朋友?
解决方案
这种事情是不存在的,而且是极其没有意义的。想象一下,你有这样的情况:
class Foo
{
enemy class Bar;
public:
Foo() {}
};
class Bar
{
void evil() { Foo{}; }
};
没有什么能阻止实现者Bar
这样做:
class Bar
{
void evil() { do_evil(*this); }
};
void do_evil(Bar &self)
{
Foo{};
}
do_evil
不是Bar
(它是一个全局函数)的成员,所以它不是敌人。因此,可以轻松规避这种不友好。
推荐阅读
- android - 如何在 Selector Drawable 中以编程方式设置纯色和笔触颜色?
- spring-boot - 如果 catalina.properties 文件在嵌入式 tomcat 中是只读的,如何使用 intellij idea 更改它
- scala - 为什么我不能在 Spark 的 mapPartitions 中使用 foreach
- python - 带有 Ldap 安装构建的 Django 失败
- c# - 如何从 MySqlDataAdapter 引入的数据集中处理来自单个列的数据?
- android - 为什么 MediaRecorder 无法通过 android camera2 api 在三星 note8 中支持 UHD 4K?
- google-cloud-platform - 错误。您的卡不支持自动定期付款-Google 云
- regex - 从豆壳提取器中提取值
- dart - Flutter:Textfield初始值产生额外的新行
- c# - c#中表达式树的单元测试