10

我是 C++ 新手,我正在编写以下代码。我需要遍历调用函数中的所有插件 - testFunction. 我知道这在 C# 中有效,但这段代码不起作用。谁能指出用 C++ 做的正确方法?

#include "stdafx.h"
#include <iostream>
#include "resource.h"

int testFunction(char* tester);
int _tmain()
{
    int mainProd=2;
    int Addons[]={7,8,9,10};

    testFunction(mainProd,Addons);


}
void testFunction(int mainProd,int addons[])
{
    for(int x = 0 ; addons.length;++x) ---- Not working 
    {
        std::cout<< addons[x];
    }
}

我尝试按照你们的以下建议来实现向量

#include "stdafx.h"
#include <iostream>
#include "resource.h"
#include <vector>

void testFunction(std::vector<int> addons);

int _tmain(int argc, _TCHAR* argv[])
{

    std::vector<int>  Addons ;
    for(int i = 0 ;i<10;++i)
    {
        Addons.push_back(i);
    }
     testFunction(Addons);
}

void testFunction(std::vector<int> addons)
{
    for(int i =0 ; i<addons.size();++i)
    {
        std::cout<<addons.at(i);
    }
}
4

6 回答 6

18

数组(原始数组)在作为参数传递给函数时衰减为指针,因此您的数组没有大小信息。

您需要将数组的长度显式传递给函数才能在函数内部知道它。

或者,更好的是,使用 astd::vector然后您将.size()在需要时始终可用。

于 2013-01-15T13:21:44.767 回答
7

正如 Tony 建议的那样,除了使用向量之外,您还可以使用模板并通过引用传递数组,以便编译器推断出数组的大小:

template<int N>
void testFunction(int mainProd,int (&addons)[N])
{
    for(int x = 0; x < N; ++x) // ---- working 
    {
        std::cout<< addons[x];
    }
}
于 2013-01-15T13:25:43.657 回答
3

您在 C++ 中使用 C# 的概念,但是,即使我们假设两种语言相似,它们也不相同。

C++ 中 ranged-for 的语法如下

for (type identifier : container) // note the ':', not ';'
{
    // do stuff
}

如果你有C++11 编译器,你可以用它来调味

顺便说一句,您似乎在代码中使用了属性:

for(int x = 0 ; addons.length;++x) // what is lenght?
{
    std::cout<< addons[x];
}

C++ 中没有这样的东西,如果你想调用一个对象方法,你需要将它作为一个函数来调用:

// assuming that the object 'addons' have a method
// named 'length'  that takes no parameters
addons.length();

但是这个addons变量不是一个对象,是一个数组(看看这个教程),所以它没有一个名为的方法或属性length;如果您需要知道它的长度以便对其进行迭代,您可以在某些情况下使用sizeof运算符(有关更多信息,请参阅教程)。

假设这addons是一个容器:

typedef std::vector<addon> Addons;
Addons addons;

如果你想使用 C++11 range-for 对其进行迭代,你可以这样写:

for (addon a : addons)
{
    // do stuff with a.
}

希望能帮助到你。

于 2013-01-15T14:20:39.963 回答
2

如果您要使用std::vectoror std::array,您可以使用std::foreach,

std::vector<int> addons = {7,8,9,10};
std::array<int, 4> addons = {7,8,9,10}; // Only use one of these...
std::foreach(addons.begin(), addon.end(), [](int i) {
    std::cout << i
});
于 2013-01-15T13:41:33.403 回答
1

代码正在处理这个

for (int i = 0; i < (end(array) - begin(array)); i++)

返回最大尺寸

测试数组是否为空

array::empty

数组元素

array::size

数组大小

sizeof()
于 2014-08-28T18:45:44.210 回答
1

如果你不想使用任何 STL 容器,你只需要通过对函数的引用来传递数组。这里的问题是,如果没有数组的确切大小,您就无法定义这样的参数。您可以克服这个限制,将函数设为模板,将大小定义为模板参数:

#include <iostream>

template<int N>
void testFunction(int mainProd,int (&addons)[N])
{
    for(int x = 0 ; x < N; ++x)
    {
        std::cout<< addons[x];
    }
}

int main()
{
    int mainProd=2;
    int Addons[]={7,8,9,10};

    testFunction(mainProd,Addons);
    return 0;
}
于 2019-03-29T16:09:53.100 回答