修改 C++ 结构的特征成员时出现问题
Problem Modifying Eigen Members of a C++ Structure
我有以下 C++ 结构
struct voxel {
const std::vector<Eigen::ArrayXf>& getVoltage() const { return m_voltage; }
const std::vector<int>& getChannelIndex() const { return m_channelIndex; }
float getx() { return m_x; }
float gety() { return m_y; }
float getz() { return m_z; }
void appendVoltage(Eigen::ArrayXf v) { m_voltage.push_back(v); }
void appendChannelIndex(int c) { m_channelIndex.push_back(c); }
void setPosition(float x, float y, float z) { m_x = x; m_y = y; m_z = z; }
void change(int c) { m_voltage.at(c)(0) = -100; std::cout << m_voltage.at(c) << "\n"; }
private:
std::vector<Eigen::ArrayXf> m_voltage;
std::vector<int> m_channelIndex;
float m_x;
float m_y;
float m_z;
};
下面用到了上面结构的数组class
class voxelBuffer {
public:
std::vector<voxel> voxels;
voxel getVoxel(ssize_t voxelId) { return voxels.at(voxelId); };
const std::vector<Eigen::ArrayXf>& getVoltage2(ssize_t voxelId) const { return voxels.at(voxelId).getVoltage(); };
ssize_t getNumVoxels() { return voxels.size(); }
};
举个例子:
voxel vx1;
vx1.setPosition(1.1, 2.1, 3.1);
vx1.appendChannelIndex(1);
vx1.appendVoltage(Eigen::ArrayXf::LinSpaced(10, 0.0, 10 - 1.0));
vx1.appendChannelIndex(2);
vx1.appendVoltage(Eigen::ArrayXf::LinSpaced(20, 0.0, 20 - 1.0));
vx1.appendChannelIndex(3);
vx1.appendVoltage(Eigen::ArrayXf::LinSpaced(30, 0.0, 30 - 1.0));
voxelBuffer vxbuffer;
vxbuffer.voxels.push_back(vx1);
我尝试更改 voxel
的第一个数组
vxbuffer.getVoxel(0).change(0);
std::cout << vxbuffer.getVoltage2(0).at(0) << "\n";
但元素仍未修改。有人可以帮我解决这个问题吗?
vxbuffer.getVoxel(0)
不是 return 对容器中 voxel
的引用。您正在 return 复制它,因为您 voxel getVoxel(ssize_t voxelId)
的 return 类型是 voxel
,而不是 voxel&
。
然后你在 voxel
类型的临时对象上调用 .change(0)
,而不是容器中的 voxel
对象。
我有以下 C++ 结构
struct voxel {
const std::vector<Eigen::ArrayXf>& getVoltage() const { return m_voltage; }
const std::vector<int>& getChannelIndex() const { return m_channelIndex; }
float getx() { return m_x; }
float gety() { return m_y; }
float getz() { return m_z; }
void appendVoltage(Eigen::ArrayXf v) { m_voltage.push_back(v); }
void appendChannelIndex(int c) { m_channelIndex.push_back(c); }
void setPosition(float x, float y, float z) { m_x = x; m_y = y; m_z = z; }
void change(int c) { m_voltage.at(c)(0) = -100; std::cout << m_voltage.at(c) << "\n"; }
private:
std::vector<Eigen::ArrayXf> m_voltage;
std::vector<int> m_channelIndex;
float m_x;
float m_y;
float m_z;
};
下面用到了上面结构的数组class
class voxelBuffer {
public:
std::vector<voxel> voxels;
voxel getVoxel(ssize_t voxelId) { return voxels.at(voxelId); };
const std::vector<Eigen::ArrayXf>& getVoltage2(ssize_t voxelId) const { return voxels.at(voxelId).getVoltage(); };
ssize_t getNumVoxels() { return voxels.size(); }
};
举个例子:
voxel vx1;
vx1.setPosition(1.1, 2.1, 3.1);
vx1.appendChannelIndex(1);
vx1.appendVoltage(Eigen::ArrayXf::LinSpaced(10, 0.0, 10 - 1.0));
vx1.appendChannelIndex(2);
vx1.appendVoltage(Eigen::ArrayXf::LinSpaced(20, 0.0, 20 - 1.0));
vx1.appendChannelIndex(3);
vx1.appendVoltage(Eigen::ArrayXf::LinSpaced(30, 0.0, 30 - 1.0));
voxelBuffer vxbuffer;
vxbuffer.voxels.push_back(vx1);
我尝试更改 voxel
vxbuffer.getVoxel(0).change(0);
std::cout << vxbuffer.getVoltage2(0).at(0) << "\n";
但元素仍未修改。有人可以帮我解决这个问题吗?
vxbuffer.getVoxel(0)
不是 return 对容器中 voxel
的引用。您正在 return 复制它,因为您 voxel getVoxel(ssize_t voxelId)
的 return 类型是 voxel
,而不是 voxel&
。
然后你在 voxel
类型的临时对象上调用 .change(0)
,而不是容器中的 voxel
对象。