【问题标题】:Pointer of Pointer of Object dereference?对象指针的指针解引用?
【发布时间】: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&lt;&lt; 输出但无法分配tempTitleA = **sortArray[k]-&gt;getTitle();,最终放弃并想出了一个hack。我现在没有尝试访问 **sortArray[k] 的 getTitle() 函数,而是这样做:

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

100% 正确。

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

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

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:

    这是运算符优先级的问题。你可以tempTitleA = (**sortArray[k]).getTitle();

    【讨论】:

    • 我在我的代码中尝试了这个,我收到以下错误:Book does not have an overloaded operator -&gt;left operand had class type。所以我用tempTitleA = (**sortArray[k].getTitle(); 替换了它,这会产生正确的响应。为什么会这样?这会不同于...(*sortArray[k]-&gt;getTitle();
    • 你是对的,第一个 * 得到了一个指向 Book 的指针(来自一个指向指针的指针),第二个得到了 Book 实例。但你也可以做 (*sortArray[k])->getTitle();没有括号, -> 或 .运算符的优先级高于 * 运算符,因此相当于执行 *(sortArray[k]->getTitle()) 会产生类似于您遇到的第一个错误。
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2021-12-08
    相关资源
    最近更新 更多