【问题标题】:Changing values in polymorphic boost::shared_ptr (inside std::vector)更改多态 boost::shared_ptr 中的值(在 std::vector 内)
【发布时间】:2015-07-25 07:05:55
【问题描述】:

我有以下基本校准结构:

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' 是私有 element_type * px;)。

访问和操作这些指向派生结构的指针中的值的正确方法是什么?

【问题讨论】:

  • 尝试:boost::dynamic_pointer_cast<:aus>(vec.at(0))->fK3

标签: c++ c++11 boost vector stdvector


【解决方案1】:

您遇到的问题是px 是智能指针的私有成员。要访问您的课程提升提供了-&gt; 运算符。您可以使用它来访问指针,就像将它用于常规指针一样。这会将您的行更改为:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多