4

谁能帮我用下面的代码来显示类对象的内容?

Q1 - 任何人都可以确认 - 如果这是在地图中存储指向表类对象的指针的正确方法吗?

Q 2 - 如何输出地图中整条记录的内容?

谢谢

#include <iostream>
#include <map>
#include <memory>
#include <string>

class Table
{
    public:
    int c1, c2, c3;
    Table() {}

    Table(int _c1,int _c2,int _c3)
    {
      c1=_c1;
      c2=_c2;
      c3=_c3;
    }
};

int main()
{

   std::map<int, std::unique_ptr<Table>> mapTable;
   std::unique_ptr<Table> up(new Table(1,2,3));

   // Is this correct way to store the pointer?
   mapTable.insert(std::make_pair(0,std::move(up)));

   // How can I display c1,c2,c3 values here with this iterator?
   for (const auto &i : mapTable)
    std::cout << i.first << " " << std::endl;

   return 0;
}

// How to get the output in the form - 0,1,2,3 ( 0 map key, 1,2,3 are c1,c2,c3 )
// std::cout << i.first << " " << i.second.get() << std::endl;  --> incorrect output
4

1 回答 1

4

Q1 - 任何人都可以确认 - 如果这是在地图中存储指向表类对象的指针的正确方法吗?

是的,这是将 a 存储unique_ptr在容器中的正确方法。唯一指针是不可复制的,因此std::move()在将它传递给函数时需要它 - 你正在这样做。

Q 2 - 如何输出地图中整条记录的内容?

除非我遗漏了一些明显的东西,否则你实际上做了工作中最难的部分。做就是了:

for (const auto &i : mapTable)
{
    std::cout << i.first << " " << std::endl;

    std::cout << i.second->c1 << std::endl;
    std::cout << i.second->c2 << std::endl;
    std::cout << i.second->c3 << std::endl;
}

迭代器是 a 的迭代器std::pair<const int, std::unique_ptr<Table>>(这是映射的值类型),因此i.first提供对键的i.second访问,并提供对映射值的访问(在您的情况下是唯一指针)。

于 2013-05-06T19:30:35.273 回答