2013-03-24 93 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