【问题标题】:Getting different instances to communicate让不同的实例进行通信
【发布时间】:2009-04-22 12:28:24
【问题描述】:

假设我有同一个类的两个实例。该类有一个指向某些数据的指针,我希望实例交换指针作为某些私有函数算法的一部分,但不会通过通过公共函数直接访问它来向其他人妥协数据。

我的第一个想法是添加一个名为 exchange 的 bool 类型的静态变量和两个方法:一个私有的:void requestExchange() 和一个公共的:Data** respond()。 requestExchange 会将 exchange 设置为 true,并紧跟来自所选实例的 respond(),这将执行以下操作:

if(exchange==true){
    exchange=false;
    return data;
}
else{return...?!

那时我意识到我无法模拟“NO OP”,因为数据实际上可能为 NULL,所以应该一切都作为响应。关于可以做什么的任何想法?

更新:我想了一下,因为请求-响应组合只会在结果 NULL 有意义的上下文中调用(交换肯定是真的)我想我可以简单地返回 NULL 并模拟这种方式没有操作。结果对于局外人来说 NULL 将毫无用处......但我仍然对建议感兴趣。必须有一种结构更完善的方法来做到这一点。

【问题讨论】:

  • 发布更多代码,说明您的问题

标签: c++ object


【解决方案1】:

同一类的对象可以直接访问彼此的私有数据。例如,您经常在复制构造函数中看到这一点。

【讨论】:

    【解决方案2】:

    您对问题的描述不是很清楚。为什么不能将 respond() 设为私有函数?

    使用静态类成员的想法充满了危险。如果两对这样的实例想要同时通信怎么办?如果一个人设置了交换标志,然后在调用响应()之前死了怎么办?线程安全呢?

    至于返回 NO-OP 或错误指示符,您可以使用异常(这就是它们的用途,但如果您的项目不使用异常,那么突然引入它们不是一个好主意),或者采用boost::可选。

    【讨论】:

      【解决方案3】:

      最好将您对返回数据和交换数据的担忧分开。

      class Foo
      {
      public:
         Bar* data()
         {
            return pData;
         }
      private:
         void exchangeData(Foo& Rhs)
         {
            if (this != &Rhs)
            {
               Bar* pTmp = pData;
               pData = Rhs.pData;
               Rhs.pData = pTmp;
            }
         }
         Bar* pData;
      }
      

      希望它符合您的要求吗?这个问题不是很清楚....

      【讨论】:

      • exchangeData()函数可以是public的。
      • 我相信他主要担心的是你只能在私人环境中进行交换。
      【解决方案4】:

      我可能错过了你问题的重点。为什么这不符合您的要求?

      class CMyClass  
      {
      public:
          void ExchangePointerWith( CMyClass& rhs );
      
      private:
          void* m_MyPtr;
      };
      

      和:

      void CMyClass::ExchangePointerWith(CMyClass &rhs)
      {
          void*   tmp= m_MyPtr;
          m_MyPtr= rhs.m_MyPtr;
          rhs.m_MyPtr= tmp;
      }
      

      【讨论】:

        【解决方案5】:

        使用 std::swap() 并构建您的类自己的交换方法,然后您就知道它应该是异常安全的。而 swap() 是大多数类应该实现的标准路由,以使它们对 STL 有效。

        请记住,一个类自动成为它自己的朋友。因此它可以访问同一类的另一个实例的私有成员变量。见 (Friend scope in C++)

        #include <algorithm>
        
        class myX
        {
            public:
                void swap(myX& rhs) throw()
                {
                    std::swap(data,rhs.data);
                }
            private:
                void* data;
         };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          • 2022-11-16
          • 1970-01-01
          • 1970-01-01
          • 2022-01-21
          • 2014-11-14
          • 1970-01-01
          相关资源
          最近更新 更多