【问题标题】:C++ Error when creating new array: Expression must have pointer to object type创建新数组时出现 C++ 错误:表达式必须具有指向对象类型的指针
【发布时间】:2013-05-20 19:15:01
【问题描述】:

我正在尝试创建一个仅取自已创建数组的正值的新数组,当我遍历原始数组时,索引出现错误“表达式必须具有指向对象类型的指针”我尝试进行研究关于错误,每个人在收到此错误时的情况都不同,所以我自己处理这个问题。这是我的代码:

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

【问题讨论】:

  • 嗯,第一个代码示例有很多错误。
  • @chris 喜欢什么?自从我完成 C++ 以来已经有一段时间了
  • int oldarray = oldarray[values] 你不应该重新声明 oldarray。您没有将 oldarray 设置为另一个 oldarray 的所有值。您正在创建一个整数“oldarray”并为其分配 oldarray[values] 的值...抱歉,由于您对 oldarray 与 oldarray 的重复命名,此解释令人困惑... int size = sizeof(oldarray) 可能不是在这种情况下是安全的,因为我们不确定 oldarray 确实是一个数组还是一个整数,所以您可能只会得到一个整数的大小,而不是 oldarray 中元素的数量。
  • @user12074577,除了到目前为止的答案之外,i > sizesize = (sizeof(oldarray))if (oldarray[i] > 0)... 有人可能会争辩说,您也应该将std::array 用于已知大小的数组。
  • 我在您的代码中添加了 cmets,有很多问题,我认为在此处列出它们比仅在每行注释行更有用。对于我认为您正在尝试做的事情,我正在编辑“正确”代码。

标签: c++ arrays pointers


【解决方案1】:

在这里,您可以使用本地 int 变量来影响 oldarray 数组:

int oldarray = oldarray[values];

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

【讨论】:

  • 这是我的问题,我正在尝试遍历数组 oldarray[values] 中的特定值,但我不能在循环中执行 oldarray[values[i]]。这就是为什么我把它放在一个局部变量中,这样我就可以遍历它了。
  • @user12074577 这没有任何意义。您迭代索引变量,而不是直接迭代值。 [] 内部是一个索引。不是值或范围或类似的东西,而是单个索引。
【解决方案2】:

这里逐行列出了这段代码的一些问题。

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 ) 是数组的大小,而不是整数的大小,或者可能是整数指针,我忘记了。

【讨论】:

  • 如何通过循环检查旧数组中的值是否为正?
  • 它没有,你可以添加它,但对我来说,一个名为 createNewArray 的函数并不意味着 createNewArrayOfAllThePositiveValues,而且你的代码太草率,我不确定这是有意的。
  • 虽然在你的解释中,所以我修复了它:)
  • 问题是,当我想使用旧数组时,我必须包含枚举值。这就是为什么它是 oldarray[values],因为在我的代码中,有 3 个不同的 oldarray[values]。例如。旧数组 [值 2],旧数组 [值 3]。所以我想专门使用 oldarray[values]。但是当我进入循环并迭代 oldarray[] 时,我不能告诉它专门查看 [values],而不仅仅是 oldarray[]。
  • 所以我在上面尝试做的是为该数组设置一个变量,这样我就可以专门遍历 oldarray[value]。例如。 int old = oldarray[values];
【解决方案3】:

问题是因为 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。

【讨论】:

  • 我认为,如果您要指出一些错误而不是仅仅说它是错误的,那么您的评论会更有用。如果我认为它是错误的,我就不会发布它。
  • 您可以从测试代码开始——它甚至无法编译。从根本上说你使用了错误的类型,它是一个 to pointerint 的指针。其余的随之而来。在更高的层面上,所有这些麻烦都可以通过使用高级 C++ 类型而不是不必要地依赖低级内存操作来避免。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多