【问题标题】:how can I compare an instance of a class with a char * variable in c++?如何将类的实例与 C++ 中的 char * 变量进行比较?
【发布时间】:2012-05-19 19:29:46
【问题描述】:

我的家庭作业需要帮助。我需要为停车场编写代码。为了编写它,我需要将我的类“Parkbox”实例的输入与#define EMPTY "--------". 一起创建在堆上并通过另一个类“Parkinggarage”创建 所以这是我的代码: Parkbox 定义:

class Parkbox{
char *license_plate; // car's license plate

public:
Parkbox(); //Default CTOR
Parkbox(char * ); // CTOR
~Parkbox(); // DTOR
void show();
};
and ParkingGarage:
class ParkingGarage{
Parkbox ***p2parkboxes;

和我的 CTOR 或 ParkingGarage 以便在堆上创建 Parkbox 实例:

ParkingGarage::ParkingGarage(const int rw,const int clm, const int plns){

        p2parkboxes = new Parkbox **[plns];//points to the floors and make the arraq of p2p same size as number as floors
        for(int p=0;p<plns;p++){
            p2parkboxes[p]= new Parkbox *[plns];//for each Plane creats an array of pointer that is same with the num of rows
            for(int r=0;r<rw;r++)
                p2parkboxes[p][r]= new Parkbox [clm];
        }
    }

void ParkingGarage::find_next_free_parking_position()
{
    for(int f=0;f<dimensions_of_parkhouse[0];f++){
        for(int r=0;r<dimensions_of_parkhouse[1];r++){
            for (int c=0;c<dimensions_of_parkhouse[2];c++){ 
                //p2parkboxes[f][r][c] is the instance of the class Pakbox
                if(p2parkboxes[f][r][c]==EMPTY)
                {
                    next_free_parking_position[0]=p;
                    next_free_parking_position[1]=r;
                    next_free_parking_position[2]=c;
                }
            }
        }
    }
}

在“p2parkboxes[f][r][c]==EMPTY”这一点上,它给了我一个错误,即“没有运算符”== 匹配这些操作数”,。 那么如何直接将类实例与 EMPTY 等其他变量进行比较?

我不知道我是否清楚你。 但是请帮助我,因为如果我不解决这个问题,我将无法继续完成我的代码。

【问题讨论】:

  • 能把p2parkboxes[f][r][c]的类型的定义贴出来吗?
  • 是的,这是声明:class ParkingGarage{ Parkbox ***p2parkboxes;我在 CTOR og parkgarage 中创建了对象: ParkingGarage::ParkingGarage(const int rw,const int clm, const int plns){ p2parkboxes = new Parkbox **[plns];// 指向地板并制作 arraq p2p 与楼层数相同的大小 for(int p=0;p
  • 这是 Parkbox 类头:class Parkbox{ char *license_plate; // 汽车的车牌 public: Parkbox(); //默认 CTOR Parkbox(char * ); // CTOR ~Parkbox(); // DTOR 无效显示(); };
  • 您可以使用您在 cmets 中发布的代码来编辑您的原始问题。
  • 如果我们不知道什么是允许的,就很难提供帮助。比较类实例的唯一方法是通过运算符重载,因此如果不允许这样做,您可能应该创建一个 getter 函数并比较其结果:strcmp(p2parkboxes[f][r][c].getPlate(), EMPTY)。希望您能尽快了解容器和 stings,因为现在,您并没有真正学习 C++。

标签: c++ char compare instance


【解决方案1】:

一般来说,您只能比较两种相同的类型。通过运算符重载,您可以定义自己的比较运算符来解决此问题。但是 C++ 默认不能比较两个类。

因此,在您的代码中,您似乎正在将 char* 类型与您的类类型进行比较。您应该将 char* 与另一个 char* 进行比较。如果将其视为字符串,则应使用 strcmp 以提高安全性

【讨论】:

  • 比较指针通常不是一个好主意(除非你真的想比较指针,而不是它们指向的值)。
  • 那么这里的解决方案是什么。我现在在这部分工作了 4 天,但我找不到解决方法:(。
  • 马里奥,这是真的。至少在 msvc++ 中,它确实可以在简单的情况下工作。不过,不知道这是否是标准的。 mrmrk 你应该自己尝试一下。如果你只是复制粘贴代码,你不会学到任何东西。
  • Weggo 感谢您的提示,但我不希望直接回答,只是建议。 :)
【解决方案2】:

您必须创建一个匹配的运算符重载。编译器错误应该为您命名参数,但该成员很可能类似于以下内容:

bool Pakbox::operator==(const char *other) {
    return !strcmp(other, this->memberstring);
}

请注意,memberstring 必须由持有该批次物品的实际成员替换。

【讨论】:

  • 但是这里我们不允许使用字符串类,我们唯一可以使用的是stcpy和strlen,我们还没有研究过运算符重载或者这个是的,所以我们不允许使用它们没有,还有其他方法吗?
  • @mrmrk 此处未使用字符串类。 strcmp 适用于 char*,就像 strlenstrcpy
  • 如果需要,您也可以编写自己的 strcmp() 函数,遍历两个字符串比较字符。没那么难。
  • 谢谢马里奥,但我必须为此找到另一个解决方案,因为我知道我的教授不会接受这个解决方案。他不会张开我们的手进行编码。无论如何谢谢你:)
  • MArio,我在没有所有这些的情况下让它工作。呸呸呸呸。谢谢你的提示。我做了一个比较函数,并通过我的私有成员变量“Licence_Plate”进行比较。然后在那个函数中我进行了比较。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2012-05-03
  • 2013-12-21
  • 2013-11-10
  • 1970-01-01
  • 2015-03-23
  • 2015-09-22
相关资源
最近更新 更多