更改多态性boost :: shared_ptr(内部std :: vector)中的值

Changing values in polymorphic boost::shared_ptr (inside std::vector)

本文关键字:std vector 内部 ptr 多态性 boost shared      更新时间:2023-10-16

i具有以下基本校准结构:

struct Standard
{
public:
    unsigned long ulCamID;
    std::string sCalibrationModel;
    float fC;
    float fXh;
    float fYh;
    Standard()
    {
        ulCamID = 0;
        fC = fXh = fYh = 0.0;
    }
    virtual ~Standard()
    {
    }
};

和派生的结构,例如:

struct Aus: public Standard
{
public:
    float fK1;
    float fK2;
    float fK3;
    float fP1;
    float fP2;
    float fB1;
    float fB2;
    Aus()
    {
        fC = fXh = fYh = fK1 = fK2 = fK3 = fP1 = fP2 = fB1 = fB2 = 0.0;
    }
};

因为我不知道我将需要多少校准,也不知道哪种校准模型,所以我认为将其放入std :: vector中并使用boost :: shared_ptr指向它们很方便。我这样做:

typedef boost::shared_ptr<CalibrationModels::Standard> shr_ptr;
std::vector<shr_ptr> vec;
shr_ptr p(new CalibrationModels::Aus);
vec.push_back(p);
p.reset(new CalibrationModels::Brown);
vec.push_back(p);

这似乎效果很好(调试器报告说向量内的指针指向派生的结构)。但是,我现在很难访问/更改向量内部的值。如果我尝试这样的事情:

boost::dynamic_pointer_cast<CalibrationModels::Aus>(vec.at(0)).px->fK3 = 1.3221e-9

它告诉我px是私人的(‘boost :: shared_ptr :: element_type * boost :: shared_ptr :: px’是private element_type * px;)。

访问和操纵这些指针内的值的正确方法是什么?

您遇到的问题是px是智能指针的私人成员。为了访问您的课程,提升提供->操作员。您可以使用它来访问指针,因为您将其用于常规指针。这将改变您的行:

boost::dynamic_pointer_cast<CalibrationModels::Aus>(vec.at(0))->fK3 = 1.3221e-9;
                                                              ^^ Difference here

请注意,如果您实际需要该值,则可以使用get()方法来获取存储在shared_ptr中的指针。