C ++函数根据参数生成数组

时间:2014-11-18 23:00:22

标签: c++ arrays

我正在尝试创建一个接受字符串和int的函数,并生成给定字符串和给定int的数组。例如,给出字符串" myarray"和5应该使用数组int myarray[5];

void function(string x, int y) {
    int x[y];
}

但这给了我declaration of 'int x[y]' shadows a parameter ...任何提示?

5 个答案:

答案 0 :(得分:3)

declaration of int x [y] shadows a parameter实际上意味着您已经隐藏了"另一个变量。

编译器应该如何区分名为x的字符串参数和名为x的数组?它没有!它们都有相同的名称,因此无法再访问字符串了。

那就是在编译时必须知道C ++中数组的大小,这在你的代码中并非如此。有些编译器将它作为扩展提供,但如果你想保持标准兼容,你应该使用向量。

void function(std::string x, int y) {
    std::vector<int> other_name(y);
}

如果您希望在某些keyvalue之间建立关联,则可能需要查看std::mapstd::unordered_map

void function(string x, int y) {
    std::map<std::string, std::vector<int>> my_map;

    my_map[x] = std::vector<int>{1, 2, 3, 4, 5};
}

这会创建一个地图,将您的字符串x与向量{1, 2, 3, 4, 5}

相关联

答案 1 :(得分:3)

你只能用宏来做这种事情,例如

#define FUNCTION(x, y) \
    int x[y]

// ...

FUNCTION(myarray, 5);

然后将扩展为:

int myarray[5];

根据需要。

但是我不推荐它 - 如果你解释背后的真正的问题,那么可能有一个更好的解决方案(不涉及宏)。

答案 2 :(得分:3)

您不能在运行时为变量命名,具有数组的字符串名称。

您只能拥有变量的编译时名称,这意味着必须在代码中定义所有变量名称。

如果你真的想拥有动态名称,那么你应该拥有某种地图,存储字符串,矢量名称和矢量。

答案 3 :(得分:2)

使用vector比使用C风格的数组更好。使用C ++ Std Lib函数比滚动自己更好。鉴于这两件事,你在任何情境之外都没有意义。

缺乏背景,这就是我要做的事情:

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    const std::string val = "Foo";
    constexpr size_t numVals = 5;
    std::vector <std::string> myVals (numVals, val);
    std::copy (myVals.begin(), myVals.end(), std::ostream_iterator <std::string> (std::cout, "\n"));
}

答案 4 :(得分:0)

代码中的错误是隐藏变量。您正在隐藏参数&#34; x&#34;通过声明一个局部变量&#34; x&#34;。当使用变量x时,编译器只知道使用局部变量x,这是一个数组,而不是传递的字符串x。

如果您传递的字符串的性质应该是变量名称,那么这不是您要查找的语法,事实上,它并不存在。 C和C ++中的变量名称在编译期间声明,而不是运行时。如果不是不可能的话,在运行时找出变量的名称可能很困难。

话虽如此,实际上没有理由关心该函数所谓的本地数组。你所关心的一切都可能是foo。您似乎更关心使用函数调用创建一个大小的数组。像内置的新东西。

int* x; // a pointer to an integer.
x = new int[10]; // x now points to an array of 10 ints and can be used as an array
// do stuff with x[] array here
delete[] x; // free up memory

如果这不是您所寻找的概念,那么在您提供更多反馈之前,您的问题已超出我的范围。