【发布时间】:2023-04-10 06:25:02
【问题描述】:
我是计算机科学专业的学生。请在给出答案之前完整阅读我的问题!
早上好堆栈溢出!今天我有一个关于在传递给函数时取消引用对象类型指针的指针的问题。
我有一个书本指针数组和一个书本指针指针数组:
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 类中,我为 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();,最终放弃并想出了一个hack。我现在没有尝试访问 **sortArray[k] 的 getTitle() 函数,而是这样做:
Book tempBookA == **sortArray[k];
tempTitleA = tempBookA.getTitle();
100% 正确。
问题是这样的: 为什么双重取消引用正确地将一本书分配给 tempBookA,但不允许直接访问该书的公共功能?
提前感谢您的时间和知识。
【问题讨论】: