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

时间:2015-12-09 10:13:31

标签: c++

  1. 我有一个类A的朋友函数'fun()'。fun接受类型A的对象的引用。让我们说objname是'obj'
  2. 在fun()好友函数中,为了访问类A的元素,需要obj.member。因为有很多成员我想跳过这个'obj.member'并说'member'应该引用传递的对象。
  3. 有没有办法实现这一目标?说在函数顶部声明一些东西,因为我不需要一次又一次地说'obj.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;
    }
    

1 个答案:

答案 0 :(得分:0)

简短的回答是,你不能 - 或者那些似乎对此有用的事情是非常糟糕的想法。

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

真的,你的问题反映了一种虚假的经济感 - 有点像Nero在屋顶上摆弄,而罗马的大部分时间都被烧毁了。 obj.在一些语句上的额外输入是微不足道的,减少打字负担的技术使您的代码不那么清晰,难以理解,并且对未来的开发人员更加困惑 - 包括更多可能是您自己。

您可以尝试使用宏

 #define X obj.

 char c = X c;

但这并不能节省打字,并且会给那些不起眼的C ++程序员(包括将来你自己)造成混淆的代码。所以这不是一个好主意。

您也可以尝试做类似

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

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