向量和smart_pointer。我没有得到实际数字
Vector and smart_pointer. I don't get the actual numbers
我有这个代码:
#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)
我如何获得实际数字?谁能告诉我我哪里做错了。
您的 Test
class 具有 get_data()
函数来获取号码,因此请使用它。
换行
std::cout << vec[i] << std::endl;
到
std::cout << vec[i] << " : " << vec[i]->get_data() << std::endl;
会给你这样的东西:
0x18f4190 : 1
0x18f41f0 : 2
0x18f41d0 : 3
您的矢量包含指针。无论它们是 shared_ptr
、unique_ptr
还是普通的 C 风格指针都没有区别。要获取指针处的值,您需要 *
运算符来取消引用指针。
std::cout << *vec[i] << std::endl;
在这种情况下,您还没有为指针指向的 class 定义 operator<<
,因此这将不起作用。但是你可以和调用指针上的函数。
std::cout << vec[i]->get_data() << std::endl;
我有这个代码:
#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)
我如何获得实际数字?谁能告诉我我哪里做错了。
您的 Test
class 具有 get_data()
函数来获取号码,因此请使用它。
换行
std::cout << vec[i] << std::endl;
到
std::cout << vec[i] << " : " << vec[i]->get_data() << std::endl;
会给你这样的东西:
0x18f4190 : 1
0x18f41f0 : 2
0x18f41d0 : 3
您的矢量包含指针。无论它们是 shared_ptr
、unique_ptr
还是普通的 C 风格指针都没有区别。要获取指针处的值,您需要 *
运算符来取消引用指针。
std::cout << *vec[i] << std::endl;
在这种情况下,您还没有为指针指向的 class 定义 operator<<
,因此这将不起作用。但是你可以
std::cout << vec[i]->get_data() << std::endl;