如何使用 C++ 在方法 decleration 中 return 数组?
How to return an array in method decleration using C++?
我正在尝试编写适合面向对象编程的 C++ 代码。
我有两个class,即Student
和Course
。在 Student
class 中,我有 quiz_scores
这是一个包含 4 个整数的一维数组。我需要 set 和 get 方法,两者都以自然通用的方式使用。
在下面,我实现了setQuizScores
方法:
void Student :: setQuizScores(int* quizscores){
for(int i = 0; i<4; i++){
quiz_scores[i] = quizscores[i];
}
其中 quizscores
是我的私人成员。
现在,接下来我想 return getQuizScores
中的这个 quiz_scores
数组用于 Student class 的每个学生。
然而,问题是 C++ 不允许我们直接 return 数组。相反,我希望我的代码结构如下:
int Student :: getQuizScores(){
Do something;
return the elements of quiz_scores;
}
我怎样才能有效地做到这一点?
我不想使用标准模板库 (STL),因此我需要创建自己的数组并根据上面的说明访问它们。
正如 setQuizScores()
可以接受一个指向数组的指针,getQuizScores()
return 也可以接受一个指向 quiz_scores
成员数组的指针,例如:
const int* Student::getQuizScores() const {
// do something...
return quiz_scores;
}
然后调用者可以根据需要访问数组元素,例如:
Student s;
...
const int *scores = s.getQuizScores();
for(int i = 0; i < 4; ++i){
cout << scores[i] << ' ';
}
或者,由于数组是固定大小的,您可以 return 对数组的引用,例如:
typedef int scoresArr[4];
scoresArr quiz_scores;
...
const scoresArr& Student::getQuizScores() const {
// do something...
return quiz_scores;
}
Student s;
...
const scoresArr &scores = s.getQuizScores();
for(int i = 0; i < 4; ++i){
cout << scores[i] << ' ';
}
有几种方法可以return一个数组:
传入数组复制到
void Student::getQuizScores(int* out) {
for(int i = 0; i < 4; i++)
out[i] = quiz_scores[i];
}
Student student;
int scores[4];
student.getQuizScores(scores);
// use scores[0], etc...
return 包含数组的结构
struct Scores {
int values[4];
};
Scores Student::getQuizScores() {
Scores s;
for(int i = 0; i < 4; i++)
s.values[i] = quiz_scores[i];
return s;
}
Student student;
Scores s = student.getQuizScores();
// use s.values[0], etc...
return class
中对 quiz_scores 数组的引用
using Scores = int[4];
Scores const& Student::getQuizScores() const {
return quiz_scores;
}
Student student;
Scores const& scores = student.getQuizScores();
// use scores[0], etc...
您可以通过 getQuizScores
方法 return 指向 quiz_scores
数组的指针,如下所示:
版本 1:使用尾随 return 类型
auto getQuizScores() -> int(*)[4]
{
//Do something;
return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
}
现在您可以使用这个 returned 指针来初始化其他数组。一个可能的例子是:
#include <iostream>
struct Student
{
int quiz_scores[4]= {1,2,3,4};
//getQuizScores returns a pointer to an array of size 4 with element of type int
auto getQuizScores() -> int(*)[4]
{
//Do something;
return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
}
void setQuizScores(int* quizscores)
{
for(int i = 0; i<4; i++)
{
quiz_scores[i] = quizscores[i];
}
}
};
int main()
{
Student s;
int arr[4];
for(int i = 0; i< 4; ++i)
{
arr[i] = (*s.getQuizScores())[i];
std::cout<<arr[i]<<std::endl;
}
return 0;
}
版本 2:不使用尾随 return 类型
int (*getQuizScores())[4]
{
//Do something;
return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
}
版本 2 与版本 1 相同,只是这次 getQuizScores
方法不使用试用 return 类型。
还有其他可能性,例如 return 对 quiz_scores
数组的引用。
我正在尝试编写适合面向对象编程的 C++ 代码。
我有两个class,即Student
和Course
。在 Student
class 中,我有 quiz_scores
这是一个包含 4 个整数的一维数组。我需要 set 和 get 方法,两者都以自然通用的方式使用。
在下面,我实现了setQuizScores
方法:
void Student :: setQuizScores(int* quizscores){
for(int i = 0; i<4; i++){
quiz_scores[i] = quizscores[i];
}
其中 quizscores
是我的私人成员。
现在,接下来我想 return getQuizScores
中的这个 quiz_scores
数组用于 Student class 的每个学生。
然而,问题是 C++ 不允许我们直接 return 数组。相反,我希望我的代码结构如下:
int Student :: getQuizScores(){
Do something;
return the elements of quiz_scores;
}
我怎样才能有效地做到这一点?
我不想使用标准模板库 (STL),因此我需要创建自己的数组并根据上面的说明访问它们。
正如 setQuizScores()
可以接受一个指向数组的指针,getQuizScores()
return 也可以接受一个指向 quiz_scores
成员数组的指针,例如:
const int* Student::getQuizScores() const {
// do something...
return quiz_scores;
}
然后调用者可以根据需要访问数组元素,例如:
Student s;
...
const int *scores = s.getQuizScores();
for(int i = 0; i < 4; ++i){
cout << scores[i] << ' ';
}
或者,由于数组是固定大小的,您可以 return 对数组的引用,例如:
typedef int scoresArr[4];
scoresArr quiz_scores;
...
const scoresArr& Student::getQuizScores() const {
// do something...
return quiz_scores;
}
Student s;
...
const scoresArr &scores = s.getQuizScores();
for(int i = 0; i < 4; ++i){
cout << scores[i] << ' ';
}
有几种方法可以return一个数组:
传入数组复制到
void Student::getQuizScores(int* out) {
for(int i = 0; i < 4; i++)
out[i] = quiz_scores[i];
}
Student student;
int scores[4];
student.getQuizScores(scores);
// use scores[0], etc...
return 包含数组的结构
struct Scores {
int values[4];
};
Scores Student::getQuizScores() {
Scores s;
for(int i = 0; i < 4; i++)
s.values[i] = quiz_scores[i];
return s;
}
Student student;
Scores s = student.getQuizScores();
// use s.values[0], etc...
return class
中对 quiz_scores 数组的引用using Scores = int[4];
Scores const& Student::getQuizScores() const {
return quiz_scores;
}
Student student;
Scores const& scores = student.getQuizScores();
// use scores[0], etc...
您可以通过 getQuizScores
方法 return 指向 quiz_scores
数组的指针,如下所示:
版本 1:使用尾随 return 类型
auto getQuizScores() -> int(*)[4]
{
//Do something;
return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
}
现在您可以使用这个 returned 指针来初始化其他数组。一个可能的例子是:
#include <iostream>
struct Student
{
int quiz_scores[4]= {1,2,3,4};
//getQuizScores returns a pointer to an array of size 4 with element of type int
auto getQuizScores() -> int(*)[4]
{
//Do something;
return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
}
void setQuizScores(int* quizscores)
{
for(int i = 0; i<4; i++)
{
quiz_scores[i] = quizscores[i];
}
}
};
int main()
{
Student s;
int arr[4];
for(int i = 0; i< 4; ++i)
{
arr[i] = (*s.getQuizScores())[i];
std::cout<<arr[i]<<std::endl;
}
return 0;
}
版本 2:不使用尾随 return 类型
int (*getQuizScores())[4]
{
//Do something;
return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
}
版本 2 与版本 1 相同,只是这次 getQuizScores
方法不使用试用 return 类型。
还有其他可能性,例如 return 对 quiz_scores
数组的引用。