C ++动态数组成员变量赋值

时间:2015-10-01 01:14:25

标签: c++ arrays memory dynamic

我遇到了为动态int数组赋值的问题,该数组是IntersectionFlowRate()类的数据成员变量。我可以在构造函数中初始化并打印数组的值。但是,当我将构造函数退出到另一个类,然后在IntersectionFlowRate()类中调用一个函数传入变量来覆盖数据成员的初始值时,它将分段错误。我调试发现覆盖数组导致seg错误。即使试图在其中一个函数中访问动态数组也会出错。

我的问题是如何从其中一个函数中编辑动态int数组成员变量的值,即setArrayElement(int index,int x)。

以下是我的一些代码。对不起,如果我不清楚或遗漏一些荒谬的事情。我被困在这几个小时。

    #ifndef INTERSECTIONFLOWRATE_H
    #define INTERSECTIONFLOWRATE_H

    class IntersectionFlowRate
    {
    public:
        IntersectionFlowRate();
        ~IntersectionFlowRate();
        void setFlowCycle(int index, int flow);

    private:
        int* m_flowRateMotorCycle;

 };
 #endif
<。>文件中的

^

    #include "IntersectionFlowRate.h"
    #include <cstdlib>
    #include <iostream>
    #include <new>

    using namespace std;
    IntersectionFlowRate::IntersectionFlowRate()
    {
        const int SIZE = 4; //Constant for m_flowRates[] size

        //DYNAMIC MEMORY DELETE LATER
        m_flowRateMotorCycle = new int[SIZE];

        for(int i = 0; i < SIZE; i++){
            m_flowRateMotorCycle[i] = 0;
            cout << m_flowRateMotorCycle[i] << endl;
            cout << "WE GOT HERE" << endl;
        }
    }

    void IntersectionFlowRate::setFlowCycle(int index, int flow){
        cout << "INDEX: " << index << endl;
        cout << "FLOW: " << flow << endl;

        m_flowRateMotorCycle[index] = flow; //seg fault is here
    }

我有另一个类创建指向IntersectionFlowRate()对象的指针,然后调用其setFlowCycle函数传入两个VALID整数。通过调试,我能够将0和3传递给函数setFlowCycle(0,3),并在函数中输出这些变量。

    #ifndef TRAFFICSIM_H
    #define TRAFFICSIM_H

    #include "IntersectionFlowRate.h"

    using namespace std;

    class TrafficSim
    {
    public:
        TrafficSim(); //Default Constructor
        TrafficSim(const char* file); //Constructor
        ~TrafficSim(); //Destructor


    private:
        IntersectionFlowRate* m_flowRate;
    };
    #endif


    #include "TrafficSim.h"
    #include "IntersectionFlowRate.h"
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <cstdlib>


    using namespace std;

    TrafficSim::TrafficSim()
    {

        IntersectionFlowRate* m_flowRate = new IntersectionFlowRate();
        m_flowRate->setFlowCycle(0, 3);

    }

我用这段代码复制了错误。如果没有其他人可以完全不确定可能出现的问题。

2 个答案:

答案 0 :(得分:2)

您正在设置名为m_flowRate的本地变量,而不是m_flowRate类的成员变量TrafficSim

而不是:

TrafficSim::TrafficSim()
{
    IntersectionFlowRate* m_flowRate = new IntersectionFlowRate();
    m_flowRate->setFlowCycle(0, 3);
}

应该是这样的:

 TrafficSim::TrafficSim()
 {
    m_flowRate = new IntersectionFlowRate();
    m_flowRate->setFlowCycle(0, 3);
 }

但总的来说,它不一定是一个指针。它可能是您班级中的对象成员。这会减少指针的使用量:

class TrafficSim
{
    public:
        TrafficSim(); //Default Constructor
        TrafficSim(const char* file); //Constructor

    private:
        IntersectionFlowRate m_flowRate;
};

然后:

TrafficSim::TrafficSim()
{
    m_flowRate.setFlowCycle(0, 3);
}

关于如何在课堂中使用std::vector的问题,以下是IntersectionFlowRate课程的代码示例,使用vector重写:

Vector sample

另外,另一个问题来源是当你有指向类中动态分配内存的指针时,你的类无法遵循Rule of 3

使用std::vector会自动处理此问题,但如果您坚持使用指针,则需要遵守发布链接中的说明。

答案 1 :(得分:0)

是的,使用std :: vector,它更简单,它是一个模板,所以它也非常快,适用于任何类型(最适合原始类型或指向对象的指针),它还有边界检查和其他有用的东西。

如果你需要快速类似数组的访问,那么你可以使用std :: map将一个键与一个值相关联,就像这样

    std::map<UINT, YourClass*> m_mapIDs_to_YourClass;

当你第一次开始使用stl容器时,它们看起来有点奇怪,但过了一会儿你就离不开它们,幸运的是它们已经成为C ++标准的一部分了。

这两个容器的边界检查可以通过将迭代器与mapYourMap.end()进行比较来完成,如果它们相等,则传递最后一个元素并尝试通过迭代器访问数据将导致异常。 std :: vector的示例(如果vecInt是向量&lt; int&gt;):

    vector<int>::iterator it = vecInt.begind();
    if (it == vecInt.end()) return; // vector is empty
    do {  // runs through elememts until out of bound, useful for searching
        i++
    while (it != vecInt.end());