C++ 不允许在友元函数中调用私有构造函数

C++ 不允许在友元函数中调用私有构造函数,c++,constructor,private,friend,C++,Constructor,Private,Friend,有没有办法不允许在friend函数中进行私有构造,以防我们的类中有带friend函数的私有构造函数。只有静态方法应该负责对象的创建,而不是这个编译器应该刷新错误消息 #include <iostream> #include <memory> using namespace std; class a { public: void see () { cout<<"Motimaa"; } static a& g

有没有办法不允许在friend函数中进行私有构造,以防我们的类中有带friend函数的私有构造函数。只有静态方法应该负责对象的创建,而不是这个编译器应该刷新错误消息

#include <iostream>
#include <memory>
using namespace std;

class a
{

public:
    void see ()
    {

    cout<<"Motimaa";

    }
    static a& getinstance()
    {
        static a instance;
        return instance;
    }

private:
    a() {};
    friend void access();
};
void access ()
{
a obj;
obj.see();//still friend function can access
}

int main()
{

a::getinstance().see();

access();
return 1;

}
#包括
#包括
使用名称空间std;
甲级
{
公众:
请参见()
{

cout友元函数可以访问befriended类的所有成员。

友元函数可以访问所有私有成员和变量,但如果您试图显式停止意外使用默认构造函数,则有可能解决您的问题

您可能会使默认构造函数终止程序。现在,创建至少接受一个参数的第二个构造函数,即使它是一个无意义的参数

下面是一个例子:

private:
  a() { cerr<<"Invalid call to constructor for object a!"; exit(); };
  a(bool dummyArg) {}

public:
  static a& getInstance() {
    static a instance(true);
    return a;
  }
private:

(){cerrNo.当你把它作为朋友时,你认为这个函数做的是正确的。它可以在你的私有变量上乱涂乱画;如果你不信任它的实现,那么通过私有构造函数创建对象应该是你最不担心的事了。不允许朋友函数通过你的使用默认构造函数。但仍然可以调用友元函数:obj(true);