【问题标题】:Can a friend class invoke a private constructor in c++? (and what's Singleton)朋友类可以在 C++ 中调用私有构造函数吗? (什么是单例)
【发布时间】:2013-01-09 01:22:58
【问题描述】:

考虑 A 类和 B 类。A 类与 B 类友好。B 类有一个私有构造函数。类 A 可以创建类 B 实例,还是私有构造函数向编译器指示该类不能被实例化,即使是朋友类?
下面是一些示例代码:

class B;

class A {
    void myFunction() {
        B newBobject;
    }
};

class B {
    private:
        B() {}
    public:
        int someData;
        friend class A;
};

另外,请注意我使用的是 C++03。如果在 C++03 中无效,在 C++11 中是否允许?

作为一个附带问题,Singleton 方法是如何相关的?它是专门处理实例化一个对象的一个​​实例,还是只实例化一个对象?

【问题讨论】:

  • 你的意思是Singleton吗?
  • @OliCharlesworth 是否编译了在这些情况下我会认为法官很差...
  • 哎呀!是的'单身'
  • @paul23:这绝不是确定的,但它会是一个开始...... ;)

标签: c++ private-constructor friend-class


【解决方案1】:

您的代码(更像您的想法)实际上在C++03c++11 上均无错误且有效。

但是,您的代码中有 2 个错误。要创建 B 类型的对象,您需要查看 B 的完整定义,这意味着 B 和 A 的定义需要交换。

其次,您需要将myfunction 设为公开,或者在 A 类中调用它。

回答你的其他问题.. 大多数单例都是这样实现的..

class Singleton{
private:

   Singleton(){}
public:
   static Singleton& GetInstance(){
       static Singleton instance;
       return instance;
   }
};

这将阻止除 Singleton 类(以及您发现的朋友)之外的任何人创建该类的实例,因此更容易实施 1 对象规则。 Singleton 将以Singleton::GetInstance() 访问。

这个和其他可能的实现显示在Wikipedia

【讨论】:

  • 谢谢!但是我必须将 myFunction 公开吗?我可以在 A 的某个公共函数中添加对它的调用 - 但我想这并不重要。
  • @AUTO 是的,你不必公开它,我不得不从 main 调用它。
  • 对于您的单例示例,是否需要或可选输入:Singleton& GetInstance() const
  • @AUTO 啊!!我错过了,函数必须是静态的,所以 const 没有意义。
猜你喜欢
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2020-11-05
  • 2013-05-21
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多