C ++ 11数组通过引用传递,但函数没有大小

时间:2018-03-19 06:50:17

标签: c++ arrays c++11

我想知道有什么方法可以避免在功能中提到数组的大小。下面是我的简单代码。每次我在main中创建一个数组时我都要改变函数passbyref的引用数组的大小。 非常感谢。

#include<iostream>
#include<string>
#include<iomanip>
#include<array>

using namespace std;

class GradeBook {
    public:

        void changevalues()
        {
            cout<<arr2[2]<<endl;
            arr2[2]=2;
            cout<<arr2[2]<<endl;
        }

        void passbyref(array<int,5>& refvar) //here 5 I have to mention myself
        {
            refvar[2]=2;
        }

    private:
        array <int,5> arr2;
};

int main() {

array <int,5> grades1{1,1,1,1,1};
GradeBook obj1;

cout<<"grades[2] before change =" <<grades1[2]<<endl;

obj1.passbyref(grades1);

cout<<"grades[2] after change =" <<grades1[2];



}

5 个答案:

答案 0 :(得分:2)

可以在passbyref函数中将数组大小指定为模板参数。

template <std::size_t N>
void passbyref(array<int,N>& refvar) {

}

N的值将自动扣除,因此无需在调用者中指定该值。这样,如果您更改main中的尺寸,passbyref中就不需要进行任何更改。

答案 1 :(得分:0)

使用动态数组可能更好 - 一个长度可以在运行时更改的动态数组。使用动态数组的最简单方法是使用在内部管理数组的std::vector

void passbyref(std::vector<int>& refvar) // no need to mention size
{
    if(refvar.size() > 2)
        refvar[2] = 2;
}

// ...

int main() {

    std::vector<int> grades1 {1, 1, 1, 1, 1}; // any length you want

    passbyref(grades1);
}

答案 2 :(得分:0)

std::array的想法是大小是特定数组的一个组成部分,因为它是类型,这使得它比c风格的数组更清晰,但它意味着在函数中,预期的大小必须在场。

可能的解决方案:

  • 模板,但std::array是正确的容器吗?
  • typedef(或使用):typedef std::array<int,5> MySpecificArray
  • std::vector

答案 3 :(得分:0)

模板是你的朋友。下面的函数适用于任何可以使用方括号索引的数组类型,并且其值类型可以转换为int。

#include<iostream>
#include<string>
#include<iomanip>
#include<array>

using namespace std;

class GradeBook {
    public:

        void changevalues()
        {
            cout<<arr2[2]<<endl;
            arr2[2]=2;
            cout<<arr2[2]<<endl;
        }

        template<typename Arr>
        void passbyref(Arr& refvar) //here 5 I have to mention myself
        {
            auto N = distance(begin(refvar), end(refvar));
            cout << "size is " << N << '\n';
            refvar[2]=2;
        }

    private:
        array <int,5> arr2;
};

int main() {

array <int,5> grades1{1,1,1,1,1};
GradeBook obj1;

cout<<"grades[2] before change =" <<grades1[2]<<endl;

obj1.passbyref(grades1);

cout<<"grades[2] after change =" <<grades1[2];
return 0;
}

答案 4 :(得分:-1)

<rant: on>这是C ++中的一个常见问题:没有办法声明一个大小恒定且仅在运行时已知的顺序容器。这是其中一个原因(与C兼容),而一些编译器特别是gcc和clang允许C ++中的可变长度数组作为编译器扩展。<rant: off>。如果只使用几个大小并且是编译时表达式,则可以使用模板整数值作为大小(std::array<int, sz>)。在任何其他情况下,您将不得不依赖std::vector以符合C ++的方式。