首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ 11数组不带大小的引用传递

C++ 11数组不带大小的引用传递
EN

Stack Overflow用户
提问于 2018-03-19 06:50:16
回答 5查看 785关注 0票数 3

我想知道是否有任何方法可以避免在函数中提到数组的大小。下面是我的简单代码。每次我在main中创建一个数组时,我都必须更改函数passbyref的引用数组的大小。非常感谢。

代码语言:javascript
复制
#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];



}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-03-19 10:19:49

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

代码语言:javascript
复制
#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;
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-19 06:57:28

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

代码语言:javascript
复制
template <std::size_t N>
void passbyref(array<int,N>& refvar) {

}

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

票数 2
EN

Stack Overflow用户

发布于 2018-03-19 08:23:36

最好使用动态数组--它的长度可以在运行时更改。处理动态数组的最简单方法是使用std::向量,它在内部管理数组。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49357228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档