c++ - 指针向量:为什么在外部改变指针不会改变向量元素?
问题描述
请看下面的例子:
#include <iostream>
#include <string>
#include <vector>
class Base {
public:
virtual void price() const = 0;
};
class D1 : public Base {
public:
virtual void price() const {
std::cout << "Price of D1\n";
}
};
class D2 : public Base {
public:
virtual void price() const {
std::cout << "Price of D2\n";
}
};
int main()
{
std::vector<Base*> v;
Base* b = new D1();
v.push_back(b);
v[0]->price(); // "Price of D1\n" - OK!
b = new D2();
v[0]->price(); // "Price of D1\n"?! Why not "Price of D2\n"
}
一个简单的基类有两个派生类。在我main()
的声明中,我声明了一个包含指向基类的指针的向量,并用指向D1
.
当我更改b
为指向 D2 的指针时b = new D2();
,为什么不v[0]
相应地更改元素?他们不应该指向同一个东西吗?
解决方案
当我将 b 更改为指向 D2 的指针时,b = new D2();,为什么不相应地更改元素 v[0]?他们不应该指向同一个东西吗?
因为将指针的副本v.push_back(b);
存储在向量中。因此,如果您之后更改为指向其他内容,它将不会对b
b
v[0]
您可以简化它并像这样查看它:
int *ptr = new int;
int *ptr_copy = ptr;
*ptr = 2; //both *ptr and *ptr_copy have value: "2"
ptr = new int; //ptr now points to some other memory
*ptr = 5; //*ptr = 5, but *ptr_copy will still be "2"
现在,如果您真的希望即使更改指针也能反映更改,则需要另一个间接级别,即“指向指针的指针”:
int main()
{
std::vector<Base**> v; //vector of Base**
Base* b = new D1();
v.push_back(&b);
(*v[0])->price(); // "Price of D1\n" - OK!
b = new D2();
(*v[0])->price(); // "Price of D2\n"
}
推荐阅读
- java - 如何对 Amazon Alexa 进行 REST API 调用
- regex - givenname.lastname@containsstring.domain 的 HTML5 输入模式
- tcp - TCP 和 UDP 行为
- google-chrome-extension - 将 jQuery 注入当前标签页 - chrome 扩展
- python - 修改由两个连续布尔数组选择的子数组
- java - 在 Java 中递归查找时的线程
- java - MVCAction 覆盖中的 Liferay SessionMessages 和 SessionErrors
- java - 如何将字符串值从 recyclerview 适配器传递到片段
- javascript - Javascript Web 音频多通道平移算法
- java - 读取一个文件的内容并仅将一个块复制到java中的另一个文件