【问题标题】:Vector and smart_pointer. I don't get the actual numbers向量和智能指针。我没有得到实际数字
【发布时间】:2021-06-22 13:50:02
【问题描述】:

我有这个代码:

#include <iostream>
#include <memory>
#include <vector>

class Test {
private:
    int data;
public:
    Test() : data{} { std::cout << "\tctor Test(" << data << ")\n"; }
    Test(int data) : data{ data } {
        std::cout << "\tctor Test(" << data << ")\n";
    }
    int get_data() const { return data; }
    ~Test() { std::cout << "\tdtor Test(" << data << ")\n"; }
};


std::unique_ptr<std::vector<std::shared_ptr<Test>>> make() {

    std::unique_ptr<std::vector<std::shared_ptr<Test>>> ptr = std::make_unique<std::vector<std::shared_ptr<Test>>>();

    return ptr;
}

void fill(std::vector<std::shared_ptr<Test>>& vec, int num) {

    for (int i = 1; i <= num; i++) {

        std::cout << "Number " << i << ": " <<std::endl;
        int a;
        std::cin >> a;

        std::shared_ptr<Test> ptr(new Test(a));
        vec.push_back(std::move(ptr));
    }
}

void display(const std::vector<std::shared_ptr<Test>>& vec) {

    
    for (unsigned i = 0; i < vec.size(); i++)
    {
        
        std::cout << vec[i] << std::endl;
    }
}

int main()
{
    std::unique_ptr<std::vector<std::shared_ptr<Test>>> vec_ptr;
    vec_ptr = make();
    std::cout << "How many data points: ";
    int num;
    std::cin >> num;
    fill(*vec_ptr, num);
    display(*vec_ptr);
    return 0;

}

我想用显示功能打印出我的矢量,但我只得到地址。我只得到了这样的东西:

How many data points: 3
 Number 1:
 1
         ctor Test(1)
 Number 2:
 2
         ctor Test(2)
 Number 3:
 3
         ctor Test(3)
 014A5820
 014A5850
 014A9460
         dtor Test(1)
         dtor Test(2)
         dtor Test(3)

我如何获得实际数字?谁能告诉我我做错了什么。

【问题讨论】:

  • 改用std::cout &lt;&lt; *vec[i] &lt;&lt; std::endl;

标签: c++ vector shared-ptr smart-pointers unique-ptr


【解决方案1】:

你的 Test 类有 get_data() 函数来获取数字,所以使用它。

换行

std::cout << vec[i] << std::endl;

std::cout << vec[i] << " : " << vec[i]->get_data() << std::endl;

会给你这样的东西:

0x18f4190 : 1
0x18f41f0 : 2
0x18f41d0 : 3

【讨论】:

    【解决方案2】:

    您的向量包含指针。无论它们是 shared_ptrunique_ptr 还是普通的 C 风格指针都没有区别。要获取指针处的值,您需要 * 运算符来取消引用指针。

    std::cout << *vec[i] << std::endl;
    

    在这种情况下,您还没有为指针指向的类定义operator&lt;&lt;,所以这不起作用。但是你可以在指针上执行as MikeCAT suggests调用一个函数。

    std::cout << vec[i]->get_data() << std::endl;
    

    【讨论】:

    • 这将导致编译错误,因为没有定义如何通过ostream打印Test。如何定义:c++ - How can I use cout << myclass - Stack Overflow
    • @MikeCAT 是的,我意识到了这一点,并且在您发表评论时正在纠正。感谢您提供附加链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多