2014-03-13 564 views
2

我是計算機科學的學生。在提出答案之前,請完整閱讀我的問題!對象解引用指針的指針?

早上好堆棧溢出!今天我有一個關於解析引用傳入函數時類型爲object的指針的指針的問題。

我有書的指針數組和書籍指針的指針數組:

Book* pBookArray[5]; 
Book** sortedPointerArray[5]; // Where sortedPointerArray[k] = &pBookArray[k] 

我有原型和調用的函數:

void sortBooksPointer(Book** sortArray[], int size, int mode) 
sortBooksPointer(sortedPointerArray, 5, 0); 

在這個函數中,我執行一個泡沫排序的書籍或作者的標題。排序算法正常工作,不是這個問題的主題。當第一次寫的功能,我試圖做類似的下面,也沒有成功:

string tempTitleA = **sortArray[k]->getTitle(); //Or Author depending on mode 

在書類,我已經定義了一個朋友的ostream它允許使用cout直接輸出。我決定做一些測試,看看也許雙解引用是不正確抽絲一本書的對象與下面的代碼行:

if (verbose) 
{ 
    cout << "Address of sortedBooks[0]: " << sortArray[0] << endl; // Address of pointer to book pointer 
    cout << "Dereference of sortedBooks[0]: " << *sortArray[0] << endl; // Address of the book pointer pointed to by sortedBooks[0] 
    cout << "Double deference of sortedBooks[0]:\n" << **sortArray[0] << endl; // Book pointed to by the pointer which sortedBooks[0] points to 
} 

成功地執行。

我花了整整一天的時間試圖弄清楚爲什麼我可以使用超載的operator<<輸出,但在最終放棄並提出黑客攻擊之前無法分配tempTitleA = **sortArray[k]->getTitle();。而不是試圖訪問的**sortArray[k]的的getTitle()函數,我現在這樣做:

Book tempBookA == **sortArray[k]; 
tempTitleA = tempBookA.getTitle(); 

哪個正確工程100%。

現在的問題是這樣的: 爲什麼雙反引用正確分配一本書tempBookA,但不允許那本書的公共職能直接訪問?

預先感謝您的時間和知識。

回答

4

這是運算符優先級的問題。你可以做tempTitleA = (**sortArray[k]).getTitle();

+0

我在我的代碼中試過這個,我收到下面的錯誤: 本書沒有重載操作符 - >''和''左操作數有類類型''。所以我用''tempTitleA =(** sortArray [k] .getTitle();''替換了它,並且這產生了正確的響應。爲什麼會出現這種情況? 這會不同於類似...' '(* sortArray [k] - > getTitle();''? –

+0

你是對的,第一個*得到了一個指向Book的指針(指針指針),第二個得到了Book實例。你也可以完成(* sortArray [k]) - > getTitle();沒有括號, - >或。運算符比*運算符具有更高的優先級,因此相當於*(sortArray [k] - > getTitle ())會產生類似於您遇到的第一個錯誤。 –