首页 > 解决方案 > 指针向量:为什么在外部改变指针不会改变向量元素?

问题描述

请看下面的例子:

#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]相应地更改元素?他们不应该指向同一个东西吗?

标签: c++pointers

解决方案


当我将 b 更改为指向 D2 的指针时,b = new D2();,为什么不相应地更改元素 v[0]?他们不应该指向同一个东西吗?

因为将指针的副本v.push_back(b);存储在向量中。因此,如果您之后更改为指向其他内容,它将不会对bbv[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"
}

推荐阅读