C ++创建新数组时出错:Expression必须具有指向对象类型的指针

时间:2013-05-20 19:15:02

标签: c++ arrays pointers

我正在尝试使用仅从已创建的数组中获取正值来创建一个新数组,当我循环遍历原始数组时,索引有一个错误“表达式必须有指向对象类型的指针”我尝试做研究关于错误,当得到这个错误时,每个人的情况都不同,所以我自己就是这个。这是我的代码:

int foo::createNewArray() const {
    int newarray[50];
    int oldarray = oldarray[values];
    int size = (sizeof(oldarray));

    for (int i = 0; i > size; i++){
        if (oldarray[i] > 0)
            newarray[i] = oldarray[i];
    }

上面的“i”是有错误的。 oldarray [values]在单独的类文件中声明。以下是代码的一小部分。

        class foo{
        int oldarray[1];
        enum unit {values};

        public:
        int createNewArray() const;
};

3 个答案:

答案 0 :(得分:1)

在这里,您使用本地oldarray变量隐藏int数组:

int oldarray = oldarray[values];

从那时起,直到块结束,oldarray表示一个int,然后其余代码对此没有多大意义。

答案 1 :(得分:0)

问题是因为oldArray需要是一个int *,而不仅仅是一个int。您当前正在将oldarray设置为数组中的第一个值,而不是将其指向数组的根。所以像int * oldArray = newArray这样的东西会让你使用索引运算符迭代oldArray。

class Foo
{
    int* oldArray;
    int size;

public:
    int* CreateNewArray() const
    {
        int* newArray = new int[size];

        int current = 0;
        for( int index = 0; index < size; index++)
        {
            if(oldArray[index] > 0)
            {
                newArray[current] = oldArray[index];
                current++;
            }
        }

        return newArray;
    }
};

我为偶然发布这个而不编译而道歉。虽然这个解决方案可能比建议的更接近金属,但它仍然是解决问题的有效方法,假设在调用此方法之前设置了oldArray和size。

答案 2 :(得分:0)

以下是此代码问题的逐行注释。

class foo{
    int oldarray[1]; //Do you really want an array of size 1?  Why not just an integer?
    enum unit {values};//An enumeration that only enumerates one thing?  Are you sure you don't really want const int VALUES = 0;  I feel like you don't really even want an enum

    public:
    int createNewArray() const; 
};

int foo::createNewArray() const {
    int newarray[50];  //Magic numbers are bad, what if sizeof(oldarray) > 50?
    int oldarray = oldarray[values];  //Re declaring oldarray as a single integer and assigning it oldarray[values] as its value.
    int size = (sizeof(oldarray));  //is this oldarray an integer or an array of integers???

    for (int i = 0; i > size; i++){  //don't you want i < size??? if size > 0, this loop will never get run.
        if (oldarray[i] > 0) //probably grabbing the correct oldarray(Compilers are smart), but not getting expected values because the array version of oldarray wasn't initialized properly.
            newarray[i] = oldarray[i];
    }

我相信你要做的是以下几点:

int* foo::createNewArray() const {
    const int SIZE = sizeof(oldarray);
    int *newArray = int[SIZE];
    for(int i = 0; i < SIZE; i++) {
        if(oldarray[i] > 0) {
            newArray[i] = oldarray[i];
        } else {
            newArray[i] = 0;//In most environments this is unnecessary, but it is safer and good style
        }
    }

    return newArray;
}

注意,即使这个代码只有当oldarray在这段代码的范围内时才会起作用(不是很好的样式,将其作为参数传递给createNewArray会更好,但没关系)并且正确实例化以便sizeof(oldarray) )是数组的大小而不是整数的大小,或者可能是整数指针,我忘了。