我是C ++的初学者,试图使用友元函数编写一个程序来添加两个数字。请帮助我,因为我得到了我的默认construtor中初始化的变量的总和,而不是我向用户请求的变量。
这是我的代码
#include "stdafx.h"
#include <iostream>
class a
{
int m_var;
int m_var2;
public:
a()
{
m_var=1;
m_var=2;
};
friend void set(a obj1);
friend void show(a ob);
};
void set(a obj1)
{
std::cout<<"please enter the first number"<< "\n";
std::cin>>obj1.m_var;
std::cout<<"please enter the second number"<<"\n";
std::cin>>obj1.m_var2;
}
void show(a obj)
{
std::cout<< (obj.m_var+obj.m_var2);
}
int main()
{
a s;
set(s);
show(s);
return 0;
}
答案 0 :(得分:1)
由于obj1
是函数set
中的局部变量,当您使用类a
的实例调用此函数时,将创建该实例的副本&#34;内部&# 34;功能和实例&#34;外部&#34;该功能不受影响。
您应该声明函数set
以输入参数obj1
by-reference 而不是 by-value 。
更改此内容:
void set(a obj1)
对此:
void set(a& obj1)
答案 1 :(得分:1)
这是值传递:
void set(a obj1)
它创建对象的副本。对此对象的更改不会在范围之外显示。
通过引用传递:
void set(a& obj1)
答案 2 :(得分:1)
void set(a obj1)
您创建了对象的副本,并且方法内部发生的任何事情都限制在方法体内,并且不会反映在方法之外。
通过引用传递
void set(a& obj1)
除非必要,否则尽量不要创建副本。更改其他方法的签名
void show(a obj)
到
void show(a& obj)
答案 3 :(得分:1)
问题是你的set
函数有值传递的参数:
void set(a obj1)
因此它会修改对象的临时副本,退出函数时修改就会消失。更改为参考:
void set(a& obj1)
它应该更好用
答案 4 :(得分:1)
有几个错误。您将在代码中找到它们:
class a
{
int m_var;
int m_var2;
^
public:
a()
{
m_var = 1;
m_var2 = 2;
^
}
^
friend void set(a& obj1);
friend void show(a ob);
};
如果要更改原始变量,请按引用引用参数,否则将更改此参数的副本,并且在函数返回后不会更改原始对象:
void set( a& obj1) {
std::cout << "please enter the first number" << "\n";
std::cin >> obj1.m_var;
std::cout << "please enter the second number" << "\n";
std::cin >> obj1.m_var2;
}
void show(a obj) {
std::cout << (obj.m_var+obj.m_var2);
}
int main() {
a s;
set( s);
show( s);
return 0;
}
答案 5 :(得分:0)
首先你的问题:set获取你的obj的副本,因为你按值传递它
但还有很多其他提示:
朋友的功能大多是糟糕的设计。为什么不给你的类提供set / get例程并在void set(a obj1)
和void show(a obj)
函数中使用这些例程?
class A // most conventions say classes have to be uppercase, objects lowercase
{
public:
A()
: m_var1(1) // Also initialization of member should be done in initializer lists.
, m_var2(2)
{
};
int get1()const {return m_var1;}
int get2()const {return m_var2;}
void set1(int i){m_var1 = i;}
void set2(int i){m_var2 = i;}
private: // put private at end of class declaration since it is not interesting for class users
int m_var1;
int m_var2;
};
void show(const A& obj) // use const references to avoid copying
{
std::cout<< (obj.get1()+obj.get2()
};
void set(A& obj1) // use reference to avoid copying that was the reason for your not working code
{
int i;
std::cout<<"please enter the first number"<< "\n";
std::cin>>i;
obj1.set1(i);
std::cout<<"please enter the second number"<<"\n";
std::cin>>i;
obj1.set2(i);
}