【问题标题】:C++ access class private attribute friend funcion with (void * callerobj) parameter带有(void * caller obj)参数的C ++访问类私有属性朋友函数
【发布时间】:2015-10-15 04:31:56
【问题描述】:

我有一个名为 sender 的类,它具有私有属性 isSending 和一个朋友函数发送。在friend函数内部,我想访问isSending属性

class sender{
    private:
    isSending=false;
    friend void* sending (void * callerobj);
}

void* sending (void * callerobj){
    while(<isSending is true>){

    }
}

我试过了

callerobj->isSending
callerobj.isSending

但是我得到了编译错误。如何使用 (void * callerobj) 参数从朋友函数访问 isSending?

【问题讨论】:

  • 尝试在sending 函数的定义和原型中将void 替换为sender。或者,如果您使用 c++11,请使用 auto 而不是 void。或者您也可以将void* 转换为sender* 类型的对象。

标签: c++


【解决方案1】:

由于callerobj的类型是void*,所以不能使用它来访问任何成员数据或成员函数。毕竟,原始对象可能是int*

如果您确定原始对象是sender*,则可以将callerobj 强制转换为sender*,然后使用它来访问其成员数据。

sender* senderobj = reinterpret_cast<sender*>(callerobj);
if ( senderobj != nullptr )
{
   while ( senderobj->isSending )
   {
      ...
   }
}

【讨论】:

    【解决方案2】:

    由于编译器不知道void* 是什么,我的意思是它是sender* 还是编译器不知道的任何其他东西。所以无法访问isSending

    尝试在sending 函数的定义和原型中将void* 替换为sender*。或者,如果您使用 c++11,请使用 auto* 而不是 void*。或者您也可以将void* 转换为sender* 类型的对象。

    注意:您必须确保 callerObj 的类型为 sender*

    【讨论】:

      【解决方案3】:

      这是一种方法,结合(呃)reinterpret_cast 和 dynamic_cast。通常,现代 C++ 中很少需要 void*,例如使用auto 或其他语言机制来避免 C 风格的类型不安全。

      #include <iostream>
      
      using std::cout;
      
      class Base
      {
      public:
          virtual void a_virtual_fcn() = 0;
      };
      
      // Need to inherit from Base to get real run-time cast below                                                                                                                                                                                 
      class SomeClass : public Base
      {
      public:
          SomeClass() : is_sending(false) {}
          void a_virtual_fcn() {}
      private:
          bool is_sending;
      
          friend int main();
      };
      
      int main()
      {
          SomeClass sc;
      
          void* vp = &sc;
      
          if ( dynamic_cast<SomeClass*>(reinterpret_cast<Base*>(vp)) ) {
              cout << "is sending " << sc.is_sending << '\n';
          }
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-08-16
        • 2021-12-30
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        相关资源
        最近更新 更多