0

我正在尝试使用指向 C++ 中自定义对象数组的指针。以下代码在使用 cygwin 的 gnu 编译器的 eclipse 上编译并运行良好。但是代码在 Visual Studio 中给出了编译错误。

错误

class 'Levels' has an illegal zero-sized array

在线的

Structure *mStructres[];

完整代码

/*
 * Levels.h
 */

#include "objects/Structure.h"

#ifndef LEVELS_H_
#define LEVELS_H_

class Levels{

public:

    //other public members

    void reInitialize();
    Levels();
    ~Levels();


private:
    //other private members
    Structure *mStructres[];
};

#endif /* LEVELS_H_ */

/////////////////////////////////////
/*
 * Levels.cpp
 */
#include "Levels.h"

Levels::Levels() {
}

Levels::~Levels() {

}

void Levels::reInitialize() {
    mStructres[size];
                for (int i = 0; i < jStructeresArr.size(); i++) {
                mStructres[i] = new Structure(obj1, obj2,
                            obj3);
                }
}

我尝试将线路更改为

Structure *mStructres;

但后来我在重新初始化方法中的这些行出现错误

mStructres[size];
            for (int i = 0; i < jStructeresArr.size(); i++) {
            mStructres[i] = new Structure(obj1, obj2,
                        obj3);
            }

我究竟做错了什么?这是跨平台开发的正确方法吗?

更新 我不想在这个阶段使用向量或标准模板。

4

1 回答 1

0

Structure *mStructres[];可能被Structure **mStructres其中一个编译器解释为。(编辑:这可能不正确,请参阅评论中的更正)它只是一个指向结构指针的指针。请注意,实际上并没有为其分配任何存储空间(除了单个指针),因此当您为其分配任何内容时,您只是将其写入随机内存。

mStructres[size];       // This does nothing, it _could_ cause a crash... 
                        //  but is otherwise the same as the next statement
42;
for (int i = 0; i < jStructeresArr.size(); i++)
    mStructres[i] = new Structure(obj1, obj2, obj3);

我怀疑你想做的只是重新创建你的指针数组。

void Levels::reInitialize() {
    for (int i=0; i< jStructeresArr.size(); i++) {
        delete mStructres[i];      // Don't leak memory
        mStructres[i] = new Structure(obj1, obj2, obj3);
    }
}

您的构造函数中还需要以下行。(灵感来自这里

    mStructres = new Structure*[jStructeresArr.size()];

如果 jStructeresArr.size() 发生变化,你有很多工作要做。因此,如果有这种可能,我强烈建议您放弃这个,而只使用 std::vector 或 std::list。

于 2013-04-01T06:04:15.533 回答