【问题标题】:Set Array to an Initialized, Passed-In Array in C++在 C++ 中将数组设置为已初始化的传入数组
【发布时间】:2013-05-23 20:17:56
【问题描述】:

请原谅这个非常基本的问题,但作为一名 Java 程序员,这个 C++ 错误并不完全是“点击”,可以这么说。

我想在一个函数中创建和初始化一个数组,然后将该数组传递给另一个函数。在接收函数中,我想访问传入数组的元素。

作为一个(缩写)示例:

class demo{
    main() {
        int members[] = { 1, 2, 3, 4, 5 };
        example.function(members);
    }
}

这会将数组members 传递给以下函数:

class example {
    int members[];

    void function(int mem[]) {
        members = mem;
    }
}

这给了我错误:

error: incompatible types in assignment of ‘int*’ to ‘int [0]’

我希望 example.members[] 等于 demo.members[]。我明白为什么我在example.function 中得到一个int*,但不知道如何在class example 中设置数组。

【问题讨论】:

  • 你不能在 C 或 C++ 中传递数组,你传递的是一个指向初始元素的指针。 void function(int mem[]) 真正的意思是void function(int *mem) [但请注意,这仅适用于函数参数] 另外,数组不可赋值。
  • 我只想要一个指针,这样我就可以访问数组的内容。我不知道如何在课堂示例中存储它。

标签: c++ arrays pointers pass-by-reference


【解决方案1】:

只需使用 C++ 方式,并使用 std::vector:

#include <vector>

class example {
    std::vector<int> members;

    void function(std::vector<int> const& mem) {
        members = mem;
    }
};

在 C++11 中,您可以通过让function() 按值获取其参数,然后将其移入数据成员:

#include <vector>

class example {
    std::vector<int> members;

    void function(std::vector<int> mem) {
        members = std::move(mem);
    }
};

【讨论】:

    【解决方案2】:

    将私有成员变量example::members更改为类型int *

    class Example {
        int *members;
    
        void function(int *mem) {
            members = mem;
        }
    }
    
    void main () {
        int array[] = { 1, 2, 3, 4, 5 };
        Example ex;
        ex.function(array);
    }
    

    【讨论】:

    • 编译器对此很满意,但是如何从 Example 中访问数组的元素?
    • 这种设计很奇怪,因为它将容器的所有权留给了Example 的客户端。这意味着您应该始终确保Example 不会超过该容器,否则在访问其元素时您将获得未定义的行为。这使得使用Example 非常容易出错。通常,您会让Example 持有它自己的被传递容器的副本。
    • @AndyProwl 是的,但我使用它的方式,这不是问题。另外,无论如何,我们高级程序员在手动内存管理方面做得不好。 :)
    • @Chance:这是不正确的,内存管理方案(或更一般地说,所有权策略)是非常高级的设计概念;)
    • @Chance 这正是 C++ 程序员更喜欢避免动态内存分配的原因(因为它是一种低级编程工具,可以很快使事情复杂化)。还有为什么@AndyProwl 建议使用std::vector,这样您就可以避免指针引入的复杂性,并尝试在堆栈上保留尽可能多的逻辑。
    【解决方案3】:

    不能直接赋值正则数组,如果真的要使用正则数组,需要循环执行。

    尝试改用std::vectorstd::array (std::array documentation)。

    例如:std::vector方式:

    class example {
       std::vector<int> members;
    
       void function(const std::vector<int>& mem) {
          members  = mem;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多