从一类到另一类直接访问存储在向量中的数据
Posted
技术标签:
【中文标题】从一类到另一类直接访问存储在向量中的数据【英文标题】:getting direct access to data stored in vector from one class to another 【发布时间】:2014-12-04 01:02:27 【问题描述】:我有一个名为 table 的类,它有一个 vector 作为公共成员,这个 table 类调用一个将数据添加到 vector 中的方法。现在我想从表类访问存储在向量中的这些数据到 NextClass。我尝试使用继承,例如 NextClass:table 工作正常,但实际上 NextClass 不是表类,它是“与表类有关系”,我也尝试将表类的类实例放入 NextClass,但是这样做将不允许我访问向量中的数据,因为它返回一个空向量。请查看我正在尝试实现的抽象代码
表类:
class Table
public:
Table();
vector<vector<float> > vec; //innitializing vector
void addTableData(); //method to add data in vector
现在我有另一个类 NextClass
class NextClass
public:
NextClass();
vector<vector<float> > nextVector; //new vector to store value from above class
vector<float> innervec;
void copyVectorToThisClass(); // method to copy vector from table class to this class
private:
Table table; //also tried with making pointer Table *table but no luck
一种将向量数据从表复制到Next类的方法
void NextClass::copyVectorToThisClass()
for( int i = 0; i<vec.size();i++)
for (unsigned int ii=0; ii<table.vec.size();ii++)
innervec.assign(table.vec[i].begin()+ii,table.vec[i].end());
//also tried with vec.pushback
nextVector.push_back(innervec);
编译时没有错误,但是当我尝试检查newVector是否包含任何数据时,它返回空,这意味着新Vector中没有数据传输,如果有办法操纵指针指向里面的数据那么类表就可以很好地完成这段代码..
修改后的代码
表类:
class Table
public:
Table();
void addTableData(); //method to add data in vector
private:
vector<vector<float> > vec; //innitializing vector
现在我有另一个类 NextClass
class NextClass
public:
NextClass();
vector<vector<float> > nextVector; //new vector to store value from above class
vector<float> innervec;
void copyVectorToThisClass(); // method to copy vector from table class to this class
Table table; //also tried with making pointer Table *table but no luck
A method to copy vector data from table to Next class
void NextClass::copyVectorToThisClass()
for( int i = 0; i<vec.size();i++)
for (unsigned int ii=0; ii<table.vec.size();ii++)
innervec.assign(table.vec[i].begin()+ii,table.vec[i].end());
//also tried with vec.pushback
nextVector.push_back(innervec);
非常感谢。
【问题讨论】:
“我尝试使用继承...” 这是个坏主意。当您想对 is a relationship 建模时使用继承。 只是为了提供信息,我试图参考它与继承的关系,但我不希望它是一种关系,这就是我遇到问题的原因 【参考方案1】:你似乎有一些概念上的错误:
您有一个表作为 nextClass 的成员,那么为什么要将它从表复制到 nextVector?这似乎是重复的数据,而且通常非常糟糕。 您将表中的 vec 属性公开,这通常是个坏主意。我建议你采用以下结构:
将copyVector改为table,因为vec是table的一部分,最终决定是否复制他的数据。
class table
....
void getVector( const vector<float>& next ) const
void table::getVector( vector<float>& next ) const
next = vec; //default = operator
然后,你可以像这样在 NextClass 中使用它:
void NextClass::copyVectorToThisClass( const table& t)
t.getVector( nextVector );
(好吧,代码是“即时”编写的,可能有错字)
【讨论】:
但是向量是多维的, 像复制构造函数一样的 = 操作符是进行深度复制,而不是影子复制,所以根据需要有任何级别是没有问题的。 我应该这样做,void getVector( const vectorvoid Table::getVector( const vector<vector<float>>& next ) const next = vec;
但收到此错误消息错误:将 'const std::vector<:vector> >' 作为 'std:: 的 'this' 参数传递vector<_tp _alloc>& std::vector<_tp _alloc>::operator=(const std::vector<_tp _alloc>&) [with _Tp = std::vector您在函数的开头初始化向量,然后运行 for 循环到 vec.size() 为 0,因为向量中没有任何内容。
【讨论】:
那么,我该如何做到这一点,老实说,我尽我所能,只是无法解决......任何建议都会非常明显 运行你的 for 循环不是 vec 的大小,而是你要复制的向量的大小,然后将你正在处理的向量的每个值 push_back 到你在新类中初始化的向量中 对不起,上面的代码有错误,我已经修改了,vec是类表的成员... 我仍然对你为什么要运行一个空向量大小的 for 循环感到困惑 如何从类表中获取向量的大小【参考方案3】:-
在类 NextClass 的构造函数中创建类 Table 的实例
使用类表对象调用函数addTableData()从文件中取数据
然后调用函数copyVectorToThisClass()
【讨论】:
【参考方案4】:struct Table
vector<vector<float> > vec;
vector<vector<float> > & getDataRef() return vec;
;
class NextClass
vector<vector<float> > nextClassVec;
public NextClass(Table t)
nextClassVec = t.getDataRef(); // method #1, maybe?
public readTable (const struct Table& tbl) // method 2 ..?
const vector<vector<float>> &tblVecRow = tbl.vec;
for(int i = 0; i < tblVecRow.size();++i)
const vector<float> & tblVecData = tblVecRow[i];
vector<float> nextClassVecData;
for(int j = 0; j < tblVecData.size(); ++j)
nextClassVecData.push_back(tblVecData[j]);
nextClassVec.push_back(nextClassVecData);
;
这对矢量数据进行了深层复制(至少这是我的想法——我还没有编译过这个)。 [非常] 可能有比这更好的解决方案(例如使用 copy() 算法);如果是这样,欢迎大家改进它。
其他说明:
真的不必是这么麻烦的IMO。但我在反抗 想改进你的问题 您当前形式的 vec.assign 在项目上重复运行 已经处理了。我认为它只是用伪代码表示你 想要复制元素【讨论】:
以上是关于从一类到另一类直接访问存储在向量中的数据的主要内容,如果未能解决你的问题,请参考以下文章