2014-03-13 30 views
-1

我是C++的初学者,尝试使用朋友函数编写用于添加两个数字的程序。请帮助我,因为我得到的初始化在我的默认构造变量的总和,而不是我向用户请求的变量。C++朋友函数添加两个数字

这里是我的代码

#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; 

} 

回答

1

由于obj1在功能set,当你调用这个函数a类的一个实例的局部变量,该实例的一个副本创建“内部”的功能,并且功能“外部”的实例不受影响。

你应该申报功能set采取输入参数obj1通过引用代替按值

更改此:

void set(a obj1) 

要这样:

void set(a& obj1) 
1

这是按值传递:

void set(a obj1) 

它创建的对象的副本。此对象的更改在范围之外将不可见。

通过引用传递:

void set(a& obj1) 
1
void set(a obj1) 

创建对象的副本,无论发生什么情况里面的方法是limitied到方法体和方法之外没有反映。

传递它通过参考

void set(a& obj1) 

尽量不要除非需要创建副本。更改其他方法

void show(a obj) 

void show(a& obj) 
1

签名的问题是,你的set功能参数按值传递:

void set(a obj1) 

所以它修改的临时副本你对象,并且当退出函数时修改不见了。更改为参考:

void set(a& obj1) 

,它应该更好地工作

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; 
} 
0

第一您的问题:一套得到您obj的副本,因为你的价值

通过,但很多其他的提示:

朋友的功能大多是糟糕的设计。

为什么不给班级设置/获取例程并在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); 
}