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这没有意义。您迭代索引