2013-03-24 86 views
-2

我写了这个代码,但好友功能无法正常工作(foodmoney和hobbymoney在我朋友的功能没有申报。这里是我的错误吗?友元函数C++里面

#include <iostream> 
using namespace std; 
class myBase 
{ 
private: 
    int friendvar; 
    int foodmoney; 
    int hobbymoney; 
public: 
    void setdata(); 
    myBase(){friendvar=0;} 
    friend void caldata(myBase &mbo); 
}; 

void myBase::setdata() 
{ 
    cout<<"Enter foodmoney :" ;cin>>foodmoney; 
    cout<<"enter hoobymoney:";cin>>hobbymoney; 
} 

void caldata(myBase &mbo) 
{ 
    mbo.friendvar=(foodmoney+hobbymoney)/2; 
    cout<<mbo.friendvar<<endl; 
} 

int main() 
{ 
    myBase baseobj; 
    baseobj.setdata(); 
    myBase friends; 
    caldata(friends); 

    return 0; 
} 
+0

你应该写somethi ng关于错误的更多问题 – 2013-03-24 07:31:06

回答

3
mbo.friendvar=(foodmoney+hobbymoney); 

应该

mbo.friendvar=(mbo.foodmoney+mbo.hobbymoney); 

等等,等等

朋友功能成员函数,所以他们没有特殊的访问任何特定的对象。您必须指定您希望访问的对象(通过在您的案例中使用mbo)。

话虽如此,我不明白为什么caldata是朋友功能的任何好理由。为什么不把它变成一个常规的成员函数?或者,也许你应该把它变成一个有两个参数的朋友函数?很难说你想在这里实现什么。

+0

在这种情况下,问题越迟钝,那么OP诚实地认为什么是“friend”对象中的member-values,它在传递之前从未有过'friends.setdata()'调用过到自由函数'caldata()'?在'myBase'的构造函数的任何初始化列表中都没有指定成员,因此所有成员都是默认初始化的,这意味着在这种情况下什么都没有。这些值是不确定的(除了'friendvar',它是在构造函数体中赋值的)。因此,OP可以预期他的最终输出是不确定的垃圾。 – WhozCraig 2013-03-24 07:31:04

+0

@WhozCraig它可能是他真实代码的摘录,因此不再有意义。我们总是告诉海报削减他们的代码以更好地说明问题。 – john 2013-03-24 07:36:34

+0

在这种情况下,我不会打赌,考虑到所呈现的内容和实际问题。 – WhozCraig 2013-03-24 07:38:47

1

变化

cin>>foodmoney; 

cin>>mbo.foodmoney; 

,改变

cin>>hobbymoney; 

cin>>mbo.hobbymoney; 
+0

不幸的是,OP在您回答后编辑了他的代码。 – john 2013-03-24 07:24:30