我目前必须编写一个程序,允许用户在两个要测试的对象之间进行选择。这不是完全相同的程序,但前提是相同的。
头文件定义的类
#include <iostream>
class example {
private:
int x;
public:
example() {
x = 10;
}
void setNum(int input) {
x = input;
}
int getNum() {
return x;
}
};
Test main和selectObj方法
#include <iostream>
#include "Header.h"
example selectObj(example A, example B) {
int selection;
std::cout << "Select object 1 or 2: ";
while (true) {
std::cin >> selection;
if (selection == 1)
return A;
else if (selection == 2)
return B;
else
std::cout << "Inavlid option, try again: ";
}
}
int main() {
example test1, test2;
selectObj(test1, test2).setNum(25);
std::cout << selectObj(test1, test2).getNum();
return 0;
}
selectObj应该返回一个对象。它运行,但它没有做setNum应该做的事情。
假设两次调用selectObj都选择选项1。它看起来像这样。
Select object 1 or 2: 1
Select object 1 or 2: 1
10
它应该输出25,但是setNum并没有真正改变test1的值。
但是,如果我写test1.setNum(25);
std::cout << test1.getNum();
那么它确实将test1的x值设置为25。
同样,这和我写的程序不完全一样(它现在被修改了,不想重写)。然而,它是同一概念的相同表示。
问题是您通过值而不是引用传递和返回参数。要解决这个问题,您可以通过引用传递并返回参数,如下面的修改代码所示:
main.cpp
#include <iostream>
#include "Header.h"
//return and pass by reference
example& selectObj(example &A, example &B) {
int selection;
std::cout << "Select object 1 or 2: ";
while (true) {
std::cin >> selection;
if (selection == 1)
return A;
else if (selection == 2)
return B;
else
std::cout << "Inavlid option, try again: ";
}
}
int main() {
example test1, test2;
selectObj(test1, test2).setNum(25);//this sets the value of x member of the object that the user chooses
std::cout << selectObj(test1, test2).getNum();
return 0;
}
当用户输入选项2时,上述程序的输出为:
Select object 1 or 2: 1
Select object 1 or 2: 1
25