class 中的 c++ 重载运算符变量 (int)

c++ Overload operator variable (int) in class

我有一个简单的 class,同一类型有多个变量:

class Hello : public HelloPure
{
private :
  int X;
  int Y;
  int Z;

我了解重载的工作原理,但我找不到使以下逻辑工作的方法:

  mh->X/*Or GetX()*/ += somevalue;
  mh->Y/*Or GetX()*/ += somevalue2;
  mh->Z/*Or GetX()*/ += somevalue3;

我不知道如何重现 :

 void operator +=(int &val, int val2);

这不会导致:“参数过多”错误。 我的主要目标是避免以下情况:

  mh->SetX(mh->GetX() + somevalue);
  mh->SetY(mh->GetY() + somevalue2);
  mh->SetZ(mh->GetZ() + somevalue3);

原因是我的真实环境要“重”得多,过载可能比当前的解决方案更优化。

感谢您以后的回答。


Edit/Update : 找到 user253751 的一个很好的解决方案,但在我的具体情况下不起作用(我将在后面解释)是 return 参考:

  int &GetX();

你可以告诉我们它:

  a->GetX() += 5;

但在我的情况下我不能那样做,我实际上是在 c++ 和 c# 之间传输信息。

所以我有一个 c++ Pure class 指针,我将使用它来计算我的数据,该指针将使用 CLI (c++/c#) class 继承自我的 pure class,Cli 指针管理指向我的 c# class 的指针。 例如,当我执行 GetX 时,它更像是这样:

  PurePointerClass->GetX()->will call the CLI class GetX() functiun
    and in the GetX() { return m_PointerToManagedC#Object->GetX(); }

这使我无法 return 直接引用我的 c# 变量。

一种常见的解决方案是使用一个或多个引用包装器类。根据您的三种情况的实际差异,您可能希望对可变数据使用一个包装器或多个包装器:

class Hello {
  void* m_PointerToManaged = nullptr;

public:
    class XRef {
        void* m_PointerToManaged;

    public:
        XRef(void* m_PointerToManaged) : m_PointerToManaged(m_PointerToManaged) { }

        void operator+=(int) {
            // your code
        }
    };
    XRef GetX() { return {m_PointerToManaged}; }

    class YRef {
        void* m_PointerToManaged;

    public:
        YRef(void* m_PointerToManaged) : m_PointerToManaged(m_PointerToManaged) { }

        void operator+=(int) {
            // something else
        }
    };
    YRef GetY() { return {m_PointerToManaged}; }

    class ZRef {
        void* m_PointerToManaged;

    public:
        ZRef(void* m_PointerToManaged) : m_PointerToManaged(m_PointerToManaged) { }

        // maybe Zs cannot be added to?
        //void operator+=(int) {
        //}
    };
    ZRef GetZ() { return {m_PointerToManaged}; }
};

https://godbolt.org/z/8nW6c5

生成的对象仍然知道托管对象(或者,您也可以传递 this 并让它使用 Hello 的通用功能),但现在可以为指定加法运算符一个只负责三个不同值之一的对象。