Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象取消引用的指针的指针?_C++_Arrays_Pointers - Fatal编程技术网

C++ 对象取消引用的指针的指针?

C++ 对象取消引用的指针的指针?,c++,arrays,pointers,C++,Arrays,Pointers,我是计算机科学专业的学生。在给出答案之前,请仔细阅读我的问题 早上好!今天我有一个关于在传递给函数时取消引用对象类型指针的问题 我有一个书本指针数组和一个书本指针数组: Book* pBookArray[5]; Book** sortedPointerArray[5]; // Where sortedPointerArray[k] = &pBookArray[k] 我有一个带有原型和调用的函数: void sortBooksPointer(Book** sortArray[], int

我是计算机科学专业的学生。在给出答案之前,请仔细阅读我的问题

早上好!今天我有一个关于在传递给函数时取消引用对象类型指针的问题

我有一个书本指针数组和一个书本指针数组:

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
在Book类中,我定义了一个friend to ostream,它允许使用
cout
直接输出。我决定做一些测试,看看双重取消引用是否没有正确地使用以下代码行绑定book对象:

 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
}
它100%正确工作

因此,问题是: 为什么双重取消引用会正确地将一本书分配给tempBookA,但不允许直接访问该书的公共功能?


提前感谢您的时间和知识。

这是运算符优先级的问题。您可以执行
entitlea=(**sortArray[k]).getTitle()

这是运算符优先级的问题。您可以执行
entitlea=(**sortArray[k]).getTitle()

我在代码中尝试了此操作,但收到以下错误:
Book没有重载运算符->
并且
左操作数具有类类型
。因此,我将其替换为
entitlea=(**sortArray[k].getTitle();
,这会产生正确的响应。为什么会这样?这会不同于…
(*sortArray[k]->getTitle();
?没错,第一个*有一个指向Book的指针(从指针指向指针)第二个得到了Book实例。但是您也可以执行(*sortArray[k])->getTitle();如果没有括号,->or.operator比*运算符具有更高的优先级,因此相当于执行*(sortArray[k]->getTitle())这将产生与您遇到的第一个错误类似的错误。我在代码中尝试了这一点,但收到了以下错误:
Book没有重载运算符->
,并且
左操作数的类类型为
因此我将其替换为
entitlea=(**sortArray[k].getTitle()这会产生正确的响应。为什么会这样?这会不同于…
(*sortArray[k]->getTitle();
?你说得对,第一个*有一个指向Book的指针(从指针指向指针),第二个*有Book实例。但是你也可以这样做(*sortArray[k])->getTitle();如果没有括号,->or.运算符的优先级高于*运算符,因此相当于执行*(sortArray[k]->getTitle()),这将产生与您遇到的第一个类似的错误。
Book tempBookA == **sortArray[k];
tempTitleA = tempBookA.getTitle();