C ++的朋友功能增加了两个数字

时间:2014-03-13 10:39:02

标签: c++

我是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;

}

6 个答案:

答案 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);
}