我有一个带有2个纯虚函数的抽象类:
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)
}
答案 0 :(得分:2)
编辑:我的原始答案是在我没有意识到的情况下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)
}
答案 1 :(得分:0)
double *m_cord;
您正在存储指向班级坐标的指针。
void CTriangle :: setCordFigure(double *cord, int size)
然后,您可能正在将“输入”读入某些变量,然后在CTriangle
个对象中引用。因此,当变量的值发生变化时,所有对象实际上都指向相同的东西。