【问题标题】:Disallow private constructor invocation in friend function禁止在友元函数中调用私有构造函数
【发布时间】:2013-10-24 21:37:37
【问题描述】:

有什么办法不允许在友元函数中进行私有构造,以防我们的类中有带友元函数的私有构造函数。只有静态方法应该负责对象的创建,除了这个编译器应该闪烁错误消息

#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;

}

【问题讨论】:

  • 没有。当你把它变成朋友时,你认为这个函数做的是正确的事情。它可以乱写你的私有变量;如果您不信任它的实现,那么通过私有构造函数创建对象应该是您最不必担心的。

标签: c++ constructor private friend


【解决方案1】:

Friend 函数可以访问所有私有成员和变量,但有一个潜在的解决方法可以解决您的问题,假设您正试图显式停止意外使用默认构造函数。

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

这是一个例子:

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

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

【讨论】:

  • 禁止友元函数使用默认构造函数意外构造对象似乎是个好方法。但友元函数仍然可以通过以下方式调用:a obj(true);
【解决方案2】:

friend 函数可以访问 befriended 类的所有成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2011-04-20
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2011-08-03
    相关资源
    最近更新 更多