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

C++ C++;创建新数组时出错:表达式必须具有指向对象类型的指针,c++,arrays,pointers,C++,Arrays,Pointers,我试图创建一个新数组,其中正值仅取自已创建的数组,当我在原始数组中循环时,索引有一个错误“表达式必须具有指向对象类型的指针”,我尝试研究该错误,每个人在出现此错误时的情况都不同,因此我只能自己处理此错误。这是我的密码: int foo::createNewArray() const { int newarray[50]; int oldarray = oldarray[values]; int size = (sizeof(oldarray)); for (in

我试图创建一个新数组,其中正值仅取自已创建的数组,当我在原始数组中循环时,索引有一个错误“表达式必须具有指向对象类型的指针”,我尝试研究该错误,每个人在出现此错误时的情况都不同,因此我只能自己处理此错误。这是我的密码:

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;
};

问题在于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;
    }
};
class-Foo
{
int*oldArray;
整数大小;
公众:
int*CreateNewArray()常量
{
int*newArray=newint[size];
int电流=0;
对于(int index=0;index0)
{
newArray[current]=oldArray[index];
电流++;
}
}
返回新数组;
}
};

我很抱歉在没有编译的情况下随意发布这个。虽然此解决方案可能比建议的更接近金属,但假设在调用此方法之前设置了oldArray和size,它仍然是解决问题的有效方法。

此处使用局部
int
变量对
oldArray
数组进行阴影处理:

int oldarray = oldarray[values];

从这一点开始,直到代码块的末尾,
oldarray
表示一个int,然后代码的其余部分就并没有多大意义了。

这里有一些注释,逐行说明了这段代码的问题

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];
    }
class-foo{
int oldarray[1];//您真的想要大小为1的数组吗?为什么不只是一个整数?
枚举单元{values};//只枚举一件事的枚举?确实不需要常量int values=0;我觉得您甚至不需要枚举
公众:
int createNewArray()常量;
};
int foo::createNewArray()常量{
int newarray[50];//幻数不好,如果sizeof(oldarray)>50怎么办?

int oldarray=oldarray[values];//将oldarray重新声明为单个整数,并将其作为值分配给oldarray[values]。 int size=(sizeof(oldarray));//这个oldarray是整数还是整数数组??? 对于(inti=0;i>size;i++){//是否希望i0,此循环将永远不会运行。 if(oldarray[i]>0)//可能获取了正确的oldarray(编译器是智能的),但由于oldarray的数组版本未正确初始化,因此未获取预期值。 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;
}
int*foo::createNewArray()常量{
const int SIZE=sizeof(oldarray);
int*newArray=int[SIZE];
对于(int i=0;i0){
newArray[i]=oldarray[i];
}否则{
newArray[i]=0;//在大多数环境中,这是不必要的,但它更安全,而且是一种好的样式
}
}
返回新数组;
}

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

嗯,第一个代码示例中有很多错误。@chris喜欢什么?我做C++int oldarray=oldarray[values]已经有一段时间了您不应重新声明oldarray。您没有将oldarray设置为其他oldarray的所有值。您正在创建一个整数“oldarray”,并将oldarray[values]的值赋给它…很抱歉,由于您对oldarray与oldarray的命名重复,此解释令人困惑…int size=sizeof(oldarray)在这种情况下可能不安全,因为我们不确定oldarray是一个数组还是一个简单的整数,您可能只得到整数的大小,而不是oldarray中的元素数。@user12074577,除了目前的答案,
i>size
size=(sizeof(oldarray))
if(oldarray[i]>0)
…有人可能会说,对于已知大小的数组,您也应该使用
std::array
。我在代码中添加了注释,有太多问题,我认为在这里列出这些问题并没有在每行注释一行那么有帮助。我正在进行“正确”的编辑代码,我想你正在尝试做的事情。这是如何通过循环检查旧数组中的值是否为正的?它不是,你可以将它添加进去,但对我来说,一个名为createNewArray的函数,并不意味着createNewArrayFallThePositiveValues,你的代码太草率了,我不确定这是有意的。它在你的解释中但问题是,当我想使用旧数组时,我必须包含枚举值。这就是为什么它是oldarray[values],因为在我的代码中,有3个不同的oldarray[values]。例如oldarray[values2],oldarray[values3]。所以我想专门使用oldarray[values]。但是当我进入循环并迭代oldarray[]时,我不能告诉它具体查看[values],而不仅仅是oldarray[]。因此,我在上面尝试的是为该数组设置一个变量,以便我可以迭代特定的oldarray[value]。例如,int old=oldarray[values];这是我的问题,我正试图迭代数组oldary[values]中的特定值,但我无法在循环中执行oldary[values[I]]。这就是为什么我将其放入局部变量中,以便可以迭代。@user12074577这没有意义。您迭代索引