在友元函数 c++ 中模拟"this"指针概念

Simulating "this" pointer concept in friend function c++

本文关键字:this 指针 模拟 友元 函数 c++      更新时间:2023-10-16
  1. 我有一个类a的友元函数"fun()"。fun引用了类型a的对象。假设objname是"obj"
  2. 在fun()friend函数中,为了访问类A的元素,需要obj.member。因为有大量的成员,我想跳过这个"obj.member",说"member"应该指代传递的对象

有没有办法做到这一点?比如在函数的顶部声明一些东西,因为我不需要一次又一次地说"obj.something",只有"something"就可以了。

我的示例代码如下。

#include<iostream>
using namespace std;
class A{
    private:
        int x;
        char c;
        string s;
    public:
    A(int x, char c, string s) : x(x), c(c), s(s){};
    friend void fun(A& obj);
};
void fun(A &obj){
    //is there any thing here i can use on top so that i don't need to refer obj.x or obj.c or obj.s ...so on?
    // anything like "using" ... which can tell which ?
    //In that way i want to similulate hidden this pointer concept.
    int x = obj.x;
    char c = obj.c;
    string s = obj.s;
    //.....similarly accessing other elements of obj 
    cout<<x<<" "<<c<<" "<<s<<" "<<endl;
}
int main()
{
    A obj(20,'Z',"friend");
    fun(obj);
    return 0;
}

简单的答案是你做不到——或者看起来有效的东西真的是个坏主意。

在friend(或任何非成员)函数中,对对象的所有引用(访问数据成员、调用非静态成员函数)都需要使用obj.<whatever>语法。

真的,你的问题反映了一种虚假经济的感觉——有点像尼禄在罗马大部分地区被烧毁时在屋顶上摆弄。在一些语句上额外键入obj.是微不足道的,而减少键入负担的技术会使您的代码变得不那么清晰、更难理解,并且对未来的开发人员(很可能包括您自己)来说更令人困惑。

你可以尝试用宏做一些事情

 #define X obj.
 char c = X c;

但这并不能节省键入的时间,而且所提供的代码会让谦逊的C++程序员(包括你自己)感到困惑。所以这不是一个好主意。

你也可以尝试做一些类似的事情

 void fun(A &obj)
 {
      obj.fun();    // call a member function that does everything needed
 }

但这在实践中有点毫无意义&仍然需要定义成员函数,如果您有,那么几乎不需要非成员版本。