如何对操作重载进行编码,以便它对 c++ 中的特定类成员(如 A<<{{1,2,3},{5,6,7}})进行操作?

  • 本文关键字:操作 编码 重载 c++ 成员 c++
  • 更新时间 :
  • 英文 :


您可以重新定义运算符<lt;在课堂上通过超载。然而,如何对其进行编码,使其特定于某个类成员进行操作?例如

class C
{
int a;
double b;
}
// I would like something like 
void main ()
{
C c;
c.a << 1; // sets class member a to value 1;
}

我想要一个在C类中定义的操作符,它专门对类成员a进行操作。

一个伪码就是

class C
{
int a;
double b;
void operator << (istream & fin)
{
... fin.get()... some code 
}
}

暂时说明显而易见的情况,假设变量是公共的,您可以使用:

class C
{
int a;
double b;
}
// I would like something like 
void main ()
{
C c;
c.a = 1; // sets class member a to value 1;
}

<<>>运算符是位移位,它们有自己的含义。为了你自己的目的而超载可能是个坏主意。

C++的做法是尽可能避免在外部设置成员变量(例如,使用RAII方法,在初始化时设置数据(。。。。

class C
{
public:
C(int a, double b) : a(a), b(b) {}
int getA() const { return a; }
double getB() const { return b; }
private:
int a;
double b;
};

或者,如果你真的需要,可以添加一个setter方法,例如

class C
{
public:
C(int a, double b) : a(a), b(b) {}
int getA() const { return a; }
double getB() const { return b; }
void setA(int v) { a = v; }
void setB(double v) { b = v; }
private:
int a;
double b;
};

理论上,您可以生成一个新类型,并重载该类型的运算符,但我不建议使用(因为更改运算符的含义几乎总是个坏主意(

struct MyIntType {
int i;
// overload cast operator
operator int () {
return i;
}
// assign
MyIntType& operator = (const int& v) {
i = v;
return *this;
}
// not recommended :(
MyIntType& operator << (const int& v) {
i = v;
return *this;
}
};
class C
{
public:
MyIntType a;
double b;
};
void main ()
{
C c;
c.a << 1; 
}

阅读了你上面的评论,听起来你想这样做:

class C
{
public:
// I'm still not recommending this :(
C& operator << (const int& v) {
a = v;
return *this;
}
private:
int a;
double b;
};
void main ()
{
C c;
c << 1; //< now sets c.a 
}

最新更新