我有一个简单的c ++类intHolder,它只包含一个int。它也可以添加到那个工作的int,或者将自己添加到另一个intHolder中包含的另一个int,这不起作用。这与我在Java中遇到的情况完全不同。发生了什么事?
class intHolder{
private:
int i;
public:
intHolder(int myInt){i = myInt;}
void addToInt(int inc){ i = i + inc;}
void printInt(){cout << i << endl;}
void addToOtherInt(intHolder other){other.addToInt(i);}
};
主要方法
int main () {
intHolder ih1(1);
ih1.printInt();//Should be 1, is 1
ih1.addToInt(3);
ih1.printInt();//Should be 4, is 4
intHolder ih2(2);
ih2.printInt();//Should be 2, is 2
ih1.addToOtherInt(ih2);
ih1.printInt();//Should be 4, is 4
ih2.printInt();//Should be 6, is 2
};
答案 0 :(得分:13)
您按价值传递intHolder
。这意味着该函数作用于本地副本,因此对调用方没有影响。您需要传递参考:
void addToOtherInt(intHolder& other) { other.addToInt(i); }
^
请注意,通常当您拥有包含支持算术运算的其他类型的类型时,您会提供重载运算符,以便您可以执行以下操作:
intHolder a = 5;
intHolder b = 10;
intHolder c = a + b;
c += 42;
a = 42 - b;
等等。有关详细信息,请参阅this extensive discussion on operator overloading。
此外,对于&#34;打印&#34;,通常会重载ostream& operator<<
,然后允许您流式传输到各种流,包括但不限于std::cout
。例如:
struct Foo
{
int i;
};
std::ostream& operator<<(std::ostream& o, const Foo& f)
{
return o << f.i;
}
允许你说
Foo f;
std::cout << f;
std::cerr << f;
std::ofstream tmp("foo.txt");
tmp << f;