用于调用另一个方法的方法的结果产生不一致的结果



我目前必须编写一个程序,允许用户在两个要测试的对象之间进行选择。这不是完全相同的程序,但前提是相同的。

头文件定义的类

#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

最新更新