2011-10-29 134 views
2

我無法重載我的< <運算符來打印未知大小的數組的內容。我搜索了一個解決方案,但是我發現的唯一一個需要我將所有私有數據成員放在一個結構體中(這對我來說似乎有點不必要)。我無法編輯函數使其成爲朋友,或者將* q更改爲& q(或常量)。如何使用數組重載ostream <<運算符?

這裏是我的< <超載代碼:

ostream& operator<<(ostream& out, Quack *q) 
{ 
    if (q->itemCount() == 0) 
     out << endl << "quack: empty" << endl << endl; 
    else 
    { 
     int i; 
     int foo; 
     for (int i = 0; i < q->itemCount(); i++) 
     { 
      foo = (*q)[i]; 
      out << *(q + i); 
     } // end for 
     out << endl; 
    } 

    return out; 
} 

這裏是我的私有數據成員:

private: 
int  *items;      // pointer to storage for the circular array. 
            // Each item in the array is an int. 
int  count; 
int  maxSize; 
int  front; 
int  back; 

下面是函數是如何調用(不能編輯此):

quack = new Quack(QUACK_SIZE); 
    //put a few items into the stack 
    cout << quack; 

以下是如何格式化輸出:

quack: 1, 2, 3, 8, 6, 7, 0 

如果數組爲空,則

quack: empty 

任何幫助將不勝感激。謝謝!

+5

所以,你想要做鴨打字,是嗎? –

+0

如果'operator <<'不允許成爲朋友,爲什麼還要列出'Quack'的私人字段? 「Quack」有哪些公開的方法可以訪問單個項目或'Quack :: items',以及項目數量? – outis

+0

@snazzy:如果你不能修改'Quack',那麼你需要在你的問題中這麼說。 –

回答

0

一般來說,你應該讓你的operator<<採取const Quack&,而不是一個Quack*

ostream& operator<<(ostream& out, const Quack &q) 
{ 
    ... 
} 

Quack類定義將這個:

friend ostream &operator<<(ostream &stream, const Quack &q); 

這將使你的operator<<訪問私有成員q

3

另一種方法是重定向到一個成員函數,就像這樣:

void Quack::printOn(ostream &out) const 
{ 
    out << "quack: "; 
    if(count == 0) 
     out << "empty"; 
    else 
    { 
     out << items[0]; 
     for (int i = 1 ; i < count ; i++) 
     { 
      out << ", " << items[i]; 
     } 
    } 
    out << "\n"; 
} 

ostream &operator<<(ostream &out,const Quack &q) 
{ 
    q.printOn(out); 
    return out; 
}