您可以重新定义运算符<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
}