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}; }
};
生成的对象仍然知道托管对象(或者,您也可以传递 this
并让它使用 Hello
的通用功能),但现在可以为指定加法运算符一个只负责三个不同值之一的对象。
我有一个简单的 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}; }
};
生成的对象仍然知道托管对象(或者,您也可以传递 this
并让它使用 Hello
的通用功能),但现在可以为指定加法运算符一个只负责三个不同值之一的对象。