2016-07-29 194 views
0

摘要的指针的一个向量我有2个纯虚函数的抽象类:呼叫功能从

class CCobjectBase 
{ 
public: 
    CCobjectBase(); 
    virtual void setCordFigure(double *, int) = 0; 
    virtual double* getCord() = 0; 
}; 

和A类是从抽象之一导出:

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; 

而我创建并存储一些值在这个向量中S请按照:

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; 
} 

似乎所有的对象都存储在相同的价值观:

m_objectBaseList.push_back(new CTriangle()); 
m_objectBaseList.at(m_objectBaseList.size() - 1) -> setCordFigure(coordonate, size); 

当我试图从矢量显示值将出现问题。我尝试了多种解决方案,但我不能简单地理解它。如果我给输入如下:

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

我假设'coordonate'是一个你可以在某个循环中重用的数组。由于'setCordFigure'不复制值,但只存储对它们的引用,所有数字都指向相同的数据。所以最后所有的数字都有你最后输入的'cord'。 – Albjenow

回答

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) 
} 
+0

它意味着被用作一个数组。 – LogicStuff

+0

请编辑您的问题,以清除此问题。我会更新我的答案。正如目前所陈述的,你在“m_coord”是一个数组的情况下证明你的用法是没有意义的。 – Smeeheey

+0

Coordonate它确实是用作数组。我从文件中提取它,并在该循环中设置函数,我将其声明为double coordonate [30],并在那里添加值。 – student

0
double *m_cord; 

您存储的指针坐标在你的班级。

void CTriangle :: setCordFigure(double *cord, int size) 

然后,也许您正在阅读的“输入”到一些变量,然后将它们CTriangle对象引用。所以当变量的值被改变时,所有的对象都指向相同的东西。