C++:如何将自己类型的数组作为函数参数传递?

问题描述 投票:0回答:1

我是 C++ 新手,所以我想知道如何将数组作为参数传递给我自己创建的类型的函数。到目前为止,我一直使用 C#、C 和 Java。

在 C# 中我可以这样做:

// my custom type
public class Foo
{
    public int ID;
    public string SomeValue;
}

// another class
private void ProcessArray(int arraySize, Foo[] myArray, int someOtherValue)
{
    // do whatever
}

但是当我在 C++ 中尝试相同的操作时,我的代码编辑器抱怨该参数。此外,当我使用数组作为第一个参数时,所有其他参数都不能再使用,因为它们被认为是错误的一部分。根据我的代码编辑器,我在传递数组的地方预计会出现“)”。 即使当我尝试使用指针而不是数组时,我也会收到错误。我已经检查过 C++ 和 C 处理数组和指针是否或多或少相同。意思是,数组可以用指针代替。由于 C++ 的工作方式与 C 相同,因此我尝试了以下方法:

void processArray(int arraySize, Foo* myArray, int someOtherValue){
    // some code here
}

还是不行。我究竟做错了什么?或者C++不支持数组作为函数参数?感谢您的帮助。顺便提一句。我正在使用 Visual Studio Code 进行编辑。

c++ arrays function c++11 parameters
1个回答
0
投票

C++ 支持多种数组类型,包括语言和库定义的数组类型。 看看下面的演示

#include <iostream>
#include <vector>
#include <array>
#include <span>

struct Foo {
    int data = 0;
};

void fun1(std::span<Foo> s)
{
    std::cout << "with span\n";
}

void fun2(Foo (&ar)[3])
{
    std::cout << "with ar\n";    
}

void fun3(Foo *ar)
{
    std::cout << "with decay to pointer\n";
}

int main ()
{
    Foo ar[] = {Foo{}, Foo{}, Foo{}};
    std::array<Foo,3> stdArray{ar[0], ar[1], ar[2]};
    std::vector vArray(std::begin(ar), std::end(ar));
   
   fun1(ar);
   fun1(stdArray);
   fun1(vArray);

   fun2(ar);
   //fun2(stdArray); // error cannot convert std::array to language level array.
   //fun2(vArray); // error cannot convert vector to language array.

   fun3(ar);
   fun3(stdArray.data());
   fun3(vArray.data());    
}

所以基本上你可以有:

  • 纯 C++ 数组,例如
    Foo ar[] = ...
  • 标准库数组,它提供安全的接口并且(几乎)与内置数组一样快,例如
    std::array<Foo, 3>
  • 动态分配的“数组”,如
    std::vector

根据您的选择,请记住:

  • std::span
    的参数始终可以封装您的数组。而且使用起来更安全
  • (&ar)[N]
    参数可以接受
    N
    元素数组
  • 参数可以是单个指针,因为
© www.soinside.com 2019 - 2024. All rights reserved.