【问题标题】:How to provide protection to friend function in C++如何在 C++ 中为友元函数提供保护
【发布时间】:2013-08-28 08:20:59
【问题描述】:

我刚刚开始学习 C++ 中的友元函数。这是我用于概念探索的程序。

#include<iostream>

using namespace std;

class one
{
private:
    int age;
public:
    one()
    {
        age=1;
    }
    void setData(int num)
    {
        age=num;
    }
friend int returnOne(one a);
};
int returnOne(one a)
{
    return a.age;
}


class two
{
private:
    int roll;
public:
    two()
    {
        roll=0;
    }
    void setData(int num)
    {
        roll=num;
    }
friend int returnTwo(two b);
};

int returnTwo(two b)
{
    return b.roll;
}


int main()
{
    one a;
    two b;
    a.setData(10);
    b.setData(12);
    cout<<returnOne(a)<<endl<<returnTwo(b)<<endl;
} 

现在我担心onetwo 类的安全性受到威胁,因为现在任何人都可以使用这些全局定义的朋友函数来访问one 类和two 类的私有成员。 如何为这些好友功能提供保护或限制其使用?

【问题讨论】:

  • 您不应将私有/受保护/公共视为安全概念。将某些内容设为私有或受保护并不能保护其免受恶意用户的攻击,这只是一个设计问题,以便更容易编写更好的代码。

标签: c++ friend friend-function


【解决方案1】:

friendship 是相互的。除非在类定义中将函数声明为友元,否则函数不能成为友元,因此这是一种选择。如果你做到了,你就必须忍受它。让一个函数成为朋友然后试图阻止它访问类内部是没有意义的,因为这正是关键字friend 的目的。

不要滥用或曲解友谊。 友谊用于表示两个实体之间有意的强耦合。如果两个实体之间存在特殊关系,即一个实体需要访问其他私有或受保护成员,但您不希望每个人都可以通过使用公共访问说明符来访问,那么您应该使用友谊。

【讨论】:

  • 在这两个实体中,一个实体将是我正在访问其数据成员的类,我正在使用签名朋友函数,但另一个实体可以是任何人,因为每个人都可以调用该函数。那么 您不希望每个人都可以通过使用公共访问说明符来访问,那么您应该使用友谊。 是真的吗?
  • @InsaneCoder 访问权限仅限于朋友函数的代码,由您决定(尽管我见过人们做可怕的事情,比如将朋友声明为由某人实施的后门否则。不要让任何人告诉你这是个好主意。)
【解决方案2】:

在类中声明友元函数会扩展类public 接口。您基本上是用更多功能扩展类(以紧密耦合这些功能为代价)。

所以你不能阻止人们使用这些函数,就像你不能阻止人们在你的类上使用公共成员方法一样(它们都是公共接口的一部分)。

但是您可以重新设计您的友元函数,这样它们就不会暴露实现细节。
为什么不为您的类定义 operator&lt;&lt; 而不是访问特定成员的函数(这是假设您提供这些函数只是为了流式传输(如果不是,则重点是静音)。

std::ostream& operator<<(std::ostream& s,two const& b)
{
    return s << b.roll;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2019-09-10
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多