2014-03-13 290 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 ())会产生类似于您遇到的第一个错误。 –