2016-07-29 193 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對象引用。所以當變量的值被改變時,所有的對象都指向相同的東西。