我想知道是否有任何方法可以避免在函数中提到数组的大小。下面是我的简单代码。每次我在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];
}发布于 2018-03-19 10:19:49
模板是你的朋友。下面的函数适用于任何数组类型,这些数组类型可以用方括号进行索引,并且具有可转换为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;
}发布于 2018-03-19 06:57:28
数组大小可以指定为passbyref函数中的模板参数。
template <std::size_t N>
void passbyref(array<int,N>& refvar) {
}N的值将自动扣除,因此不需要在调用方中指定该值。这样,如果您在main中更改大小,passbyref中就不需要进行任何更改。
发布于 2018-03-19 08:23:36
最好使用动态数组--它的长度可以在运行时更改。处理动态数组的最简单方法是使用std::向量,它在内部管理数组。
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);
}https://stackoverflow.com/questions/49357228
复制相似问题