更改多态性boost :: shared_ptr(内部std :: vector)中的值
Changing values in polymorphic boost::shared_ptr (inside std::vector)
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
中的指针。
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?