C++数组参数

C++ Array passig parameters

本文关键字:参数 数组 C++      更新时间:2023-10-16

我是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数据类型是什么:

int

calculdesplaces(int, int);

它是:int

calculdesplaces函数定义placeautobus[2][40]的数据类型是什么:

int autobus::calculdesplaces(int typeautobus, int *placeautobus[2][40]){ ... }

它是:int*

函数调用calculdesplacesplaceautobus[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;
}