【问题标题】:Call Function From An Vector of Pointers of Abstract Class从抽象类指针向量调用函数
【发布时间】:2016-07-29 08:32:54
【问题描述】:

我有一个带有 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)
}

【问题讨论】:

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

标签: c++ qt


【解决方案1】:

编辑:我最初的回答是在我没有意识到 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)
}

【讨论】:

  • 它是作为一个数组使用的。
  • 请编辑您的问题以明确这一点。我会更新我的答案。正如目前所说,在 m_coord 是一个数组的情况下,您演示的用法没有意义
  • Coordonate 它确实是用作数组。我从一个文件中提取它并在那个循环中设置函数,我将它声明为双坐标 [30] 并在那里添加值。
  • @LogicStuff 抱歉,我以为您是评论中的 OP。学生,setCordFigure 是什么意思?设置这个数组的单个元素,还是设置整个数组?请澄清 coordonate 到底是什么,也许显示创建和初始化它的代码。
【解决方案2】:
double *m_cord;

您在类中存储指向坐标的指针。

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

然后,您可能正在将“输入”读入一些变量,然后在您的CTriangle 对象中引用。因此,随着变量的值发生变化,所有对象实际上都指向相同的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多