从抽象类的指针向量调用函数
Call Function From An Vector of Pointers of Abstract Class
我有一个抽象类,它有两个纯虚拟函数:
class CCobjectBase
{
public:
CCobjectBase();
virtual void setCordFigure(double *, int) = 0;
virtual double* getCord() = 0;
};
还有一个派生自抽象类的类:
class CTriangle : public CCobjectBase
{
public:
CTriangle();
~CTriangle();
void setCordFigure(double *, int);
double* getCord();
private:
double *m_cord;
int m_size;
}
void CTriangle :: setCordFigure(double *cord, int size)
{
m_cord = cord;
m_size = size;
}
double * CTriangle :: getCord()
{
return m_cord;
}
我使用了一个指向抽象类的指针向量:
std::vector<CCobjectBase *> m_objectBaseList;
我在这个向量中创建并存储一些值,如下所示:
m_objectBaseList.push_back(new CTriangle());
m_objectBaseList.at(m_objectBaseList.size() - 1) -> setCordFigure(coordonate, size);
当我试图显示矢量的值时,问题就出现了:
for(size_t i=0; i< m_objectBaseList.size(); i++)
{
double * cord = m_objectBaseList.at(i) -> getCord();
out<<cord[0]<<" "<<cord[1]<<" "<<cord[2]<<" "<<cord[3]<<" "<<cord[4]<<" "<<cord[5]<<endl;
}
似乎所有对象都存储了相同的值。我尝试了多种解决方案,但我不能简单地弄清楚。如果我输入如下:
Object1: 1 2 3 4 5 6
Object2: 3 2 3 3 5 5
...
Objectn: 1 1 2 2 1 1
所有对象都具有Objectn:的值
Object1: 1 1 2 2 1 1
Object2: 1 1 2 2 1 1
...
Objectn: 1 1 2 2 1 1
问题不是来自参数coordonate
,因为我在setCordFigure(double *cord, int size){} function
中进行了测试,它显示良好。
有什么可能的建议吗?
编辑:
代码中我设置值的部分实际上是这样的:
void MainWindow :: creazaObiecte(int numarOrdine, double *coordonate, int size)
{
QTextStream out(stdout);
switch(numarOrdine)
{
case 1:
m_objectBaseList.push_back(new CTriangle());
m_objectBaseList.at(m_objectBaseList.size() - 1) -> setCordFigure(coordonate, size);
break;
...
}
}
我从文件的每一行读取的内容中使用这个函数。代码中我调用此函数的部分类似于:
while(--condition--)
{
double coordonate[30]; //coordonate is used to store values as an array Ex: 20 30 12 2 32 12 etc
//fill coordonate with values from the line of the file
creazaObiecte(ordinClasa, coordonate, size); //ordinClasa is a variable that stores the index of the object (1 stands for triangle)
}
编辑:我最初的回答是在我没有意识到m_coord
应该是一个数组的情况下,所以这是不合适的。
操作setCordFigure
只是将m_coord
成员指针设置为传递的参数。它不复制基础数组。所以最后所有的对象都指向同一个数组。
您需要在setCordFigure
函数中实际复制数组。您可以使用裸数组来完成此操作,但最好使用vector
。所以这是可能的代码:
class CCobjectBase
{
public:
CCobjectBase();
virtual void setCordFigure(const std::vector<double>&) = 0;
virtual std::vector<double>& getCord() = 0;
};
class CTriangle : public CCobjectBase
{
public:
CTriangle();
~CTriangle();
void setCordFigure(const std::vector<double>&);
std::vector<double>& getCord();
private:
std::vector<double> m_cord;
int m_size;
}
void CTriangle :: setCordFigure(const std::vector<double>& cord)
{
m_cord = cord;
}
std::vector<double>& CTriangle :: getCord()
{
return m_cord;
}
然后您的创建功能变为:
void MainWindow :: creazaObiecte(int numarOrdine, const std::vector<double>& coordonate)
{
QTextStream out(stdout);
switch(numarOrdine)
{
case 1:
m_objectBaseList.push_back(new CTriangle());
m_objectBaseList.at(m_objectBaseList.size() - 1) -> setCordFigure(coordonate);
break;
...
}
}
你的人口函数变成:
while(--condition--)
{
std::vector<double> coordonate(30); //coordonate is used to store values as an array Ex: 20 30 12 2 32 12 etc
//fill coordonate with values from the line of the file
creazaObiecte(ordinClasa, coordonate); //ordinClasa is a variable that stores the index of the object (1 stands for triangle)
}
double *m_cord;
您正在存储一个指向类中坐标的指针。
void CTriangle :: setCordFigure(double *cord, int size)
然后,您可能正在将"输入"读取到一些变量中,这些变量随后在CTriangle
对象中被引用。因此,当变量的值发生变化时,所有对象都指向相同的对象。
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?