2009-10-04 89 views
0
class object_1 
{ 
    public: 
    ... 

    friend ofstream& operator<<(ofstream &out, const object_1 &obj_1); 
    friend object_2; 

    private: 

    char *pCh_mem1; 
    char *pCh_mem2; 
    int *pInt_mem1; 
    int *pInt_mem2; 
}; 


class object_2 
{ 
public: 
... 
friend ofstream& operator<<(ofstream &out, const object_2 &obj_2); 
friend object_1; 
}; 

Object1的實現文件很典型。 Ctor,Dtor和一些方法。我沒有發佈方法聲明在標題中,因爲它們與我的問題無關。對象和運算符重載C++

這是非常重要的,我討論的對象一生。這是我真的需要了解的東西。發生的事情是,當我在main中調用object_2時,調用運算符重載函數。那麼接下來的操作符重載函數被調用:

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

,我們在這裏:

void object_1::display(std::ostream &out) 
{ 
out << left << setw(28) << "Person" << setw(20) << "Place" ; 
out << right << setw(5) << "Thing" << setw(5) << "Idea" << endl; 

out << left << setw(28) << "----" << setw(20) << "--------" ; 
out << right << setw(5) << "----- " << setw(5) << "------" << endl; 
} 

在實現文件的頂部的了iomanip庫。所以setw(X)和一切都已定義。我得到0的所有打印到控制檯。我的物體是否超出了範圍?我想是的,因爲當我在需要之前完成所有這些工作時,它可以正常工作。也就是說,當我將這個函數稱爲運算符超載的主體時,它就起作用。我想是因爲對象是重新聲明:

ostream& operator<<(ostream& out, const object_2& obj_2); 

再經過我打印格式化方法我需要打印在從主傳遞到第一個對象的構造函數的信息; object_1。當發生這種情況時,我們處於類似的重載函數中,它的實現文件也是相同的。 IM呼叫從過載的第二對象過載功能這兩種方法:

ostream& operator<<(ostream& out, const object_1& obj_1) 
{ 
out << obj_1.pCh_mem1 << obj_1.pCh_mem2; 
return out; 
} 

//主 object_2 obj_2(4);

static void method1() 
{ 
//do stuff 
} 
static void method2() 
{ 
    //do stuff 
} 
static void method3() 
{ 
    //do stuff 
} 
int main(void) 
{ 
    method1(); 
    method2(); 
    method3(); 
    cout << obj_2; 
    return 0; // and such 
} 

一旦objc_2被調用就像你在上面看到的那樣,那麼object2的類的運算符重載將被調用。我不能使用我的任何私人成員,因爲它是非法操作。我想我的問題是。我如何打印我的object2中的我的私人成員在我的object2的運算符重載函數?的static_cast的?我有一個從主要的隨機片段,它的複雜,我不能改變它。

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

就是我一直試圖做的,就像你看到的上面的就是調用其他對象的方法,並從他們的信息。但是這個信息全是NULL!我從一個國際跳板跳來跳去到下一個,它的所有NULL!

+1

我假設「object1」與「object_1」相同,但是「stock」也是「object_1」?並且「顯示」一種靜態方法?在最後一段代碼中調用它似乎是靜態的,但是定義(如果「stock」和「object1」是相同的)似乎不是一個靜態方法。 在這個星期天早上我不知道我是否比平時慢,但是你選擇的代碼對我來說似乎有點混亂。 – 2009-10-04 05:38:09

回答

1

AFAICT,object_1object_2是不相關的類(除了他們是朋友)。因此object_2沒有任何與object_1相關的狀態。

因此,當您嘗試打印一個object_2就好像它是一個object_1,這不可能工作。出人意料的是,這一呼籲在所有工作:

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

因爲沒有object_1在這裏爲它的方法可以被稱爲(但後來,你可能並不意味着這是真正的代碼,因爲它是缺失也是分號)。

這並不完全清楚你想達到什麼。也許你想object_2繼承object_1,以便任何object_2也將有成員pCh_mem1等?也許你想要object_2的成員是object_1類型的對象?

+0

我希望object_2繼承object_1 – user40120 2009-10-04 05:27:42

+0

@lampshade:好的,那麼繼續吧,讓'object_1'成爲'object_2'的基類。你可能想讓這些成員受到保護,以便'object_2'能夠訪問它們。 – 2009-10-04 05:47:44

+0

謝謝Mr.L你一直很有幫助=)這是我的另一個被忽視的問題。這只是一個簡單的修復! =) – user40120 2009-10-04 05:54:40

0
ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
    out << object_1[thatIndexThatIstoreditAt] 
    return out; 
} 

我需要寫這個東西的幾個報告。 =)