【问题标题】:Accessing a base class member with .*& (accessing priority_queue container)使用 .*& 访问基类成员(访问 priority_queue 容器)
【发布时间】:2021-10-30 21:34:22
【问题描述】:

我试图从以下代码中理解

How to iterate over a priority_queue?

我认为,由于 HackedQueue 是从 priority_queue 私有派生的,因此它可以访问其私有数据。所以,我假设*&HackedQueue::c 返回基类对象的地址,并且它被调用为 q。不过,并不完全清楚,甚至更清楚它是如何成为有效语法的。


提到priority_queue,我想知道是否仍然没有更干净的解决方法。例如,此链接上的 4th c'tor

priority_queue( const Compare& compare, Container&& cont );

https://en.cppreference.com/w/cpp/container/priority_queue/priority_queue

似乎提供了一个可以使用的容器,而不是只读输入。我在visual studio头文件中看不到它,我不清楚&&是什么。


相关,我不明白反对的问题,例如为什么我需要访问私有容器,它不是为此而设计的。那么,如何调试优先级队列,基本需要打印其元素?


#include <queue>
#include <cstdlib>
#include <iostream>
using namespace std;

template <class T, class S, class C>
S& Container(priority_queue<T, S, C>& q) {
    struct HackedQueue : private priority_queue<T, S, C> {
        static S& Container(priority_queue<T, S, C>& q) {
            return q.*&HackedQueue::c;
        }
    };
    return HackedQueue::Container(q);
}

int main()
{
    priority_queue<int> pq;
    vector<int> &tasks = Container(pq);

    cout<<"Putting numbers into the queue"<<endl;
    for(int i=0;i<20;i++){
        int temp=rand();
        cout<<temp<<endl;
        pq.push(temp);
    }

    cout<<endl<<"Reading numbers in the queue"<<endl;
    for(vector<int>::iterator i=tasks.begin();i!=tasks.end();i++)
        cout<<*i<<endl;

    cout<<endl<<"Taking numbers out of the queue"<<endl;
    while(!pq.empty()){
        int temp=pq.top();
        pq.pop();
        cout<<temp<<endl;
    }

    return 0;
}

【问题讨论】:

  • 这是q.*(&amp;HackedQueue::c) - 使用指向成员的指针的语法。但我什至没有试图理解这里发生了什么可怕的恐怖事件。
  • 请每个 stackoverflow.com 问题一个问题。你能edit你的问题并提出一个single的问题,可以给出single的答案吗? &amp;&amp; 是一个右值参考,请参阅您的 C++ 教科书以获取更多信息和详细说明(Stackoverflow 并不能真正替代 C++ 教科书,如果有一些特定对于任何不清楚的主题,您可以询问并准确解释您想要澄清的内容,但对于一般教程和解释,我们建议人们参考他们的教科书)。
  • &amp;HackedQueue::c 是一个指向成员的指针 - cpriority_queue 的底层容器成员。 .* 是“取消引用指向成员的指针”运算符。这些扭曲用于访问同一类的不同实例的受保护成员。
  • 您的问题是什么?您是在问该代码是什么意思您是在问how do you debug a priority queue, where the basic need is to print its elements? 是什么&amp;&amp; 是什么意思?请不要问多个问题。 Mentioning priority_queue, I was wondering if...这部分是否与与您的问题相关或可以删除​​,这似乎是一个声明?

标签: c++


【解决方案1】:

我试图理解下面的代码

让我们说点:

  • .* 是指向成员的访问运算符。见https://en.cppreference.com/w/cpp/language/operator_member_access
  • 代码使用priority_queue内部表示,它使用队列使用的底层容器来存储数据并使用名称为cprotected 成员访问该数据。
    • 来自glibc stl_queue.h

      class priority_queue
      {
           ...
      protected:
           //  See queue::c for notes on these names.
           _Sequence  c;
           _Compare   comp;
      
    • 请参阅 this note in queue::c,了解为什么它只是命名为 c。和 C++98 标准。

  • HackedQueue 继承自 priority_queue,因此它可以访问它的 protected 成员,
  • &amp;HackedQueue::c 是类HackedQueue 中成员c 的指针(继承自priority_queue),
  • q.*(&amp;HackedQueue::c); 使用指向成员的指针访问对象 q 中的成员 c
  • 然后该函数在传递的对象q 中返回对该成员的引用。

什么是&&。

右值引用声明器。见https://en.cppreference.com/w/cpp/language/reference

如何调试优先级队列,基本需要打印其元素?

带有调试器。无论如何,这个问题也在链接问题How to iterate over a priority_queue?中得到了回答。

【讨论】:

  • Nitpick: &amp;HackedQueue::cS std::priority_queue&lt;T, S, C&gt;::* 类型,而不是 S HackedQueue::* 类型,这就是为什么它可以与不是 HackedQueue 的东西一起使用的原因
猜你喜欢
  • 2012-10-18
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多