我是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);
}
}
答案 0 :(得分:15)
当一个数组(原始数组)作为参数传递给函数时衰减成指针,因此你的数组没有大小信息。
您需要将数组的长度显式传递给函数,以便在函数内部知道它。
或者,更好的是,使用std::vector
,然后在需要时随时可以使用.size()
。
答案 1 :(得分:7)
除了使用向量之外,如Tony建议的那样,您可以使用模板并通过引用传递数组,以便编译器推断出数组的大小:
template<int N>
void testFunction(int mainProd,int (&addons)[N])
{
for(int x = 0; x < N; ++x) // ---- working
{
std::cout<< addons[x];
}
}
答案 2 :(得分:3)
你在C ++中使用C#的概念,但是,即使我们假设两种语言都相似,它们也不相同。
C ++中ranged-for的语法是the following:
for (type identifier : container) // note the ':', not ';'
{
// do stuff
}
如果您有C++11 compiler,则可以将此用于 flavor 。
顺便说一句,您似乎在使用代码中的属性:
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
变量不是一个对象,是一个数组(看一看this tutorial),所以它没有名为length
的方法或属性;如果您需要知道它的长度以便迭代它,您可以在某些上下文中使用sizeof
运算符(有关详细信息,请参阅教程)。
我们假设addons
是一个容器:
typedef std::vector<addon> Addons;
Addons addons;
如果要使用C ++ 11 range-for迭代它,可以按如下方式编写它:
for (addon a : addons)
{
// do stuff with a.
}
希望它有所帮助。
答案 3 :(得分:2)
如果您使用std::vector
或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
});
答案 4 :(得分:1)
代码正在使用此
for(int i = 0; i&lt;(end(array) - begin(array)); i ++)
返回最大尺寸
测试数组是否为空
array::empty
数组元素
array::size
数组大小
sizeof()
答案 5 :(得分:0)
如果您不想使用任何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;
}