2010-10-16 141 views
7

我该如何让代码工作?C++参考数组

#include <iostream> 
using namespace std; 

void writeTable(int (&tab)[],int x){ 
    for(int i=0;i<x;i++){ 
     cout << "Enter value " << i+1 <<endl; 
     cin >> tab[i] ; 
    } 
} 


int main(void){ 
    int howMany; 
    cout << "How many elemets" << endl; 
    cin >> howMany; 

    int table[howMany]; 
    int (&ref)[howMany]=table; 
    writeTable(ref,howMany); 
    return 0; 
} 

这里是我的错误:

|4|error: parameter ‘tab’ includes reference to array of unknown bound ‘int []’| 
|18|error: invalid initialization of reference of type ‘int (&)[]’ from expression of type ‘int [(((unsigned int)(((int)howMany) + -0x00000000000000001)) + 1)]’| 
|4|error: in passing argument 1 of ‘void writeTable(int (&)[], int)’| 

感谢您的帮助

+0

C++没有VLA。 – kennytm 2010-10-16 16:33:36

+0

YOu可以使用std :: vector – 2010-10-16 18:19:19

回答

19

如果您打算通过数组的大小,然后取出参考

void f(int a[]) 

相当于

void f(int* a) 

因此,如果这是所关心的问题,则不会进行复制。

如果你想通过引用获取数组,那么你必须指定维度。例如

void f(int (&a)[10]) 

当然,最好两者的是第三个解决方案,这是使用std ::矢量的,如果需要,通过参照,参照const或通过值传递它们。 HTH

+0

同意,传入一个指向数组的指针是这里的方法。 – JeffW 2010-10-16 16:37:52

+0

好thx求助,但我有第三个选项我可以传递维度使用变量的一个额外的问题?如果是的话,看起来如何调用该功能,它是原型? – John 2010-10-16 16:41:22

+0

@Artur:参见Prasson Saurav的回答和我的评论。或者你的意思是矢量的?对于矢量的看到Amardeep的回答:) – 2010-10-16 16:42:54

0

引用的数组是非法的,如果这是你想要做的。这个标题对我来说不是100%清楚的。

+0

虚拟-1:很显然,他正在尝试创建一个数组的引用,而不是一个引用数组 – 2010-10-16 16:33:52

+0

@Armen - 语法很混乱,我很尊敬地不同意。这很可能是你的答案是他需要的。 – 2010-10-16 16:34:58

+0

@Steve:如果你看代码(更不用说语法),很显然他并不想创建一个引用数组 – 2010-10-16 16:36:45

5

如果您使writeTable成为函数模板,则不需要指定数组的维数。

template <typename T,size_t N> 
void writeTable(T (&tab)[N]) //Template argument deduction 
{ 
    for(int i=0 ; i<N ; i++){ 
     // code .... 
    } 
} 

int table[howMany]; // C++ doesn't have Variable Length Arrays. `howMany` must be a constant 
writeTable(table); // type and size of `table` is automatically deduced 
+1

但要留意,在这种情况下,你将无法将动态分配的数组传递给此功能。 – 2010-10-16 16:37:47

+2

@阿门:是的!为什么他需要一个动态分配的数组(他会使用'std :: vector')? – 2010-10-16 16:42:15

+0

我的评论是针对OP,而不是你:) – 2010-10-16 16:44:44

6

这里是做的稍微C++风格:

#include <iostream> 
#include <vector> 

void writeTable(std::vector<int> &tab) 
{ 
    int val; 

    for (unsigned int i=0; i<tab.size(); i++) 
    { 
     std::cout << "Enter value " << i+1 << std::endl; 
     if (std::cin >> val) 
     { 
      tab[i] = val; 
     } 
    } 
} 


int main() 
{ 
    int howMany; 
    std::cout << "How many elements?" << std::endl; 
    std::cin >> howMany; 

    std::vector<int> table(howMany); 
    writeTable(table); 

    return 0; 
} 
+0

+1,但更标准/便携的方式是声明我的类型为矢量 :: size_type – 2010-10-16 16:48:16

+0

@Armen:我通常使用size_t但懒惰设置。我wasn不知道向量<> :: size_type。谢谢(你的)信息。 – 2010-10-16 16:52:18

+0

@Amardeep:那么,USUALLY矢量 :: size_type被定义为size_t,而这又是USUALLY typedef'd作为unsigned int。但没有保证 – 2010-10-16 16:53:49

1

继Amardeep的答案,这里是一个C++ 11的方式来做到这一点:

#include <iostream> 
#include <vector> 

void writeTable(std::vector<int> &tab) 
{ 
    int val; 

    for (auto& cell : tab) 
    { 
     std::cout << "Enter value " << i+1 << std::endl; 
     if (std::cin >> val) 
     { 
      cell = val; 
     } 
    } 
} 


int main() 
{ 
    int howMany; 
    std::cout << "How many elements?" << std::endl; 
    std::cin >> howMany; 

    std::vector<int> table(howMany); 
    writeTable(table); 

    return 0; 
} 

注意基于范围的for用于writeTable