C++数组参数
C++ Array passig parameters
我是C++新手我尝试将数组作为参数传递,但找不到解决方案。这是我的代码:我的标头代码汽车巴士
#ifndef autobus_H
#define autobus_H
#include <iostream>
using namespace std;
class autobus{
public :
int placeautobus[2] [40];
autobus();
void affichageTicket();
int calculdesplaces(int, int);
};
#endif
巴士.cpp
#include <iostream>
#include "autobus.h"
autobus::autobus(){
int i,j;
for (i=0;i<2;i++) {
for (j=0;j<40;j++)
placeautobus[i][j] = 0;
}
};
void autobus::affichageTicket()
{
}
int autobus::calculdesplaces(int typeautobus, int *placeautobus[2][40]){
int placenumero;
for (int place = 0; place < 40; place++){
if ( placeautobus[typeautobus][place] ==0) {
placenumero = place+1;
cout <<"Places : "<< placenumero <<endl;
}
}
return placenumero;
}
终于是我的主要.cpp
#include <cstdlib>
#include <iostream>
#include "autobus.h"
using namespace std;
int main()
{
int TypeAutobus;
autobus *choixautobus = new autobus();
cout << "1 for smoking bus" << endl;
cout << "2 for non-smoking bus" << endl;
cin >> TypeAutobus;
choixautobus->calculdesplaces(TypeAutobus, choixautobus->placeautobus[2][40]);
system("PAUSE");
return EXIT_SUCCESS;
}
一切正常,但是当我在main中添加此行时.cpp
: choixautobus->calculdesplaces(TypeAutobus, choixautobus->placeautobus[2][40]);
我有一个错误,我尝试了很多事情。我只想用变量调用我的函数演算:choixautobus具有数组placeautobus。
有人可以知道如何做到这一点。
谢谢
就像其他人已经说过的那样,由于演算的声明和定义不匹配,您现在拥有的代码现在不应该编译。
您根本不需要传递 placeautobus 数组,因为它是 autobus 类的成员。 只需从演算中删除您的第二个参数,您应该能够做您想做的事。
int autobus::calculdesplaces(int typeautobus){
int placenumero;
for (int place = 0; place < 40; place++){
if ( placeautobus[typeautobus][place] ==0) {
placenumero = place+1;
cout <<"Places : "<< placenumero <<endl;
}
}
return placenumero;
}
在类声明中,您需要为 calculdesplaces()
的第二个参数指定正确的数组指针类型:
class autobus{
public :
autobus();
void affichageTicket();
int calculdesplaces(int typeautobus, int (*placeautobus)[40]);
int placeautobus[2][40];
};
这声明您正在传递指向 40 个int
元素数组的指针。这正是 2D 数组在使用其名称时int placeautobus[2][40];
衰减的类型:当您提到数组的名称时,数组名称会衰减为指向其第一个元素的指针。对于类型 int ()[2][40]
的数组,即指向第一个线数组的指针(类型为 int (*)[40]
)。
请注意,int (*placeautobus)[40]
中的括号非常重要:数组下标运算符[]
的优先级高于取消引用运算符*
,因此int (*placeautobus)[40]
的含义与int* placeautobus[40]
非常不同。
我还冒昧地在方法声明中包含变量名,这为读者提供了基本信息,即使编译器忽略了它。
在 calculdesplaces()
的实现中,您可以像访问任何 2D 数组一样访问参数数组:
int autobus::calculdesplaces(int typeautobus, int (*placeautobus)[40]) {
int placenumero;
for (int place = 0; place < 40; place++) {
if ( placeautobus[typeautobus][place] ==0) {
placenumero = place+1;
cout <<"Places : "<< placenumero <<endl;
}
}
return placenumero;
}
现在,您只需传递数组即可轻松调用函数:
int main() {
int TypeAutobus;
autobus *choixautobus = new autobus();
cout << "1 for smoking bus" << endl;
cout << "2 for non-smoking bus" << endl;
cin >> TypeAutobus;
choixautobus->calculdesplaces(TypeAutobus, choixautobus->placeautobus);
system("PAUSE");
return EXIT_SUCCESS;
}
注意:
以上只能治标不治本。实际的问题是,类本身的设计是有缺陷的。数据成员通常不应该是公共的,方法应该处理调用它们的对象的数据,而不是依赖于通过其他参数传入对象的部分。因此,类定义应如下所示:
class autobus{
public :
autobus();
void affichageTicket();
int calculdesplaces(int typeautobus);
private:
int placeautobus[2][40];
};
calculdesplaces()
的定义没有太大变化,它只是没有用函数参数遮盖已经可用的数组成员:
int autobus::calculdesplaces(int typeautobus) {
int placenumero;
for (int place = 0; place < 40; place++) {
if ( placeautobus[typeautobus][place] ==0) {
placenumero = place+1;
cout <<"Places : "<< placenumero <<endl;
}
}
return placenumero;
}
而且你不需要在main()
中"抓取到对象",数组通过this
指针隐式传递:
int main() {
int TypeAutobus;
autobus *choixautobus = new autobus();
cout << "1 for smoking bus" << endl;
cout << "2 for non-smoking bus" << endl;
cin >> TypeAutobus;
choixautobus->calculdesplaces(TypeAutobus);
system("PAUSE");
return EXIT_SUCCESS;
}
你还没有提到它的错误是什么。但我认为这就是问题所在:
函数声明中第二个参数calculdesplaces
数据类型是什么:
calculdesplaces(int, int);
它是:int
calculdesplaces
函数定义中placeautobus[2][40]
的数据类型是什么:
int autobus::calculdesplaces(int typeautobus, int *placeautobus[2][40]){ ... }
它是:int*
函数调用calculdesplaces
中placeautobus[2][40]
的数据类型是什么:
choixautobus->calculdesplaces(TypeAutobus, choixautobus->placeautobus[2][40]);
看class autobus { ... }
,就是:int
因此,函数声明、定义和调用中使用的数据类型不匹配。尝试解决此问题。
不应编译代码。
微积分的成员函数声明
int calculdesplaces(int, int);
与其定义不符
int autobus::calculdesplaces(int typeautobus, int *placeautobus[2][40]){
第二个参数的类型不同。
至于错误消息,则应调用该函数
choixautobus->calculdesplaces( TypeAutobus, choixautobus->placeautobus );
考虑到该函数存在错误。将函数作为第一个参数 1 或 2 传递给函数,并在有效索引为 0 和 1 时使用这些值作为数组的索引。
此外,该函数不需要第二个参数,因为它处理数据成员
int placeautobus[2] [40];
所以我会按以下方式定义类和成员函数
class autobus{
public :
int placeautobus[2] [40];
autobus();
void affichageTicket();
int calculdesplaces(int);
};
#include <iostream>
#include "autobus.h"
autobus::autobus() : placeautobus {}
{
}
void autobus::affichageTicket()
{
}
int autobus::calculdesplaces( int typeautobus )
{
int placenumero = 0;
for (int place = 0; place < 40; place++)
{
if ( placeautobus[typeautobus - 1][place] == 0 )
{
placenumero = place+1;
cout <<"Places : "<< placenumero <<endl;
break;
}
}
return placenumero;
}
虽然我不明白你从函数中返回什么:)
您也可以在类定义中指定数组的初始化
class autobus{
public :
int placeautobus[2] [40] = {};
//...
在这种情况下,主要可以看起来像
int main()
{
int TypeAutobus;
autobus *choixautobus = new autobus();
cout << "1 for smoking bus" << endl;
cout << "2 for non-smoking bus" << endl;
cin >> TypeAutobus;
choixautobus->calculdesplaces( TypeAutobus );
system("PAUSE");
return EXIT_SUCCESS;
}
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 估计函数参数数组的维度
- 温度参数数组的内存泄漏
- 如何将值附加到命令行参数数组?
- libpqxx:如何绑定参数数组
- 如何在德尔福中C++参数数组指针算术
- C++函数参数或参数数组
- 将 std::function 代理为需要参数数组的 C 函数
- 分析字符串参数数组
- Pro*C传递参数数组
- OpenCV错误:cvGetSize中的错误参数(数组应该是CvMat或IplImage)
- c++无限参数数组
- 查找命令行参数数组中的元素数
- 如何将目录中所有具有完整路径的文件传递到execv中的参数数组
- ODBC:参数数组-忽略参数
- 使用lambda参数数组