改变多态 boost::shared_ptr 中的值(在 std::vector 中)
Changing values in polymorphic boost::shared_ptr (inside std::vector)
我有以下基本校准结构:
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);
这似乎工作正常(调试器报告向量内的指针指向派生结构)。但是,我现在很难 access/change 向量中的值。如果我尝试这样的事情:
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; )。
访问和操作那些指向派生结构的指针中的值的正确方法是什么?
你遇到的问题是 px
是智能指针的私有成员。要访问您的 class 提升,请提供 ->
运算符。您可以使用它来访问指针,就像将它用于常规指针一样。这会将您的行更改为:
boost::dynamic_pointer_cast<CalibrationModels::Aus>(vec.at(0))->fK3 = 1.3221e-9;
^^ Difference here
请注意,如果您确实需要该值,可以使用get()
方法获取存储在shared_ptr
中的指针。
我有以下基本校准结构:
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);
这似乎工作正常(调试器报告向量内的指针指向派生结构)。但是,我现在很难 access/change 向量中的值。如果我尝试这样的事情:
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; )。
访问和操作那些指向派生结构的指针中的值的正确方法是什么?
你遇到的问题是 px
是智能指针的私有成员。要访问您的 class 提升,请提供 ->
运算符。您可以使用它来访问指针,就像将它用于常规指针一样。这会将您的行更改为:
boost::dynamic_pointer_cast<CalibrationModels::Aus>(vec.at(0))->fK3 = 1.3221e-9;
^^ Difference here
请注意,如果您确实需要该值,可以使用get()
方法获取存储在shared_ptr
中的指针。