Почему мой код говорит "Да", когда он должен сказать "Нет"? - PullRequest
4 голосов
/ 15 октября 2019

Когда значение freeSeats равно 0, в моем коде все еще говорится, что у человека есть свободные места в его / ее машине.

Я создал два класса. Один для автомобиля и один для человека. В классе Car есть функция, чтобы увидеть, есть ли в машине свободные места. Человек-объект может иметь машину. Когда я проверяю, есть ли у человека свободные места, мой код отвечает «Да», даже если я ввожу «0». Почему?

#pragma once
#include <iostream>

//Here is class Car declaration
class Car {
private:
    unsigned int freeSeats; 
public:
    bool hasFreeSeats() const; 
    void reserveFreeSeat();
    Car( unsigned int freeSeats);

};


//Here is function definition
#include "Car.h"

bool Car::hasFreeSeats() const {
    if (freeSeats > 0)
        return true; 
    return false;
}

void Car::reserveFreeSeat() { 
    --freeSeats; 
}

Car::Car(unsigned int freeSeas) : 
    freeSeats{ freeSeats }        
{
}


//Here is class Person declaration

class Person {
private:
    std::string name;
    std::string email; 
    Car *car; //pointer to a car
public:
    Person(std::string name, std::string email, Car *car = nullptr);
    std::string getName() const; 
    std::string getEmail() const; 
    void setEmail(); 
    bool hasAvalibaleSeats() const; 
    friend std::ostream& operator << (std::ostream& os, const Person& p);
};

//Here is function definition 


Person::Person(std::string name, std::string email, Car *car) : 
    name{ name }, email{ email }, car{ car }
{
}

std::string Person::getName() const {
    return name;
}

std::string Person::getEmail() const {
    return email;
}

void Person::setEmail() {
    std::string newEmail;
    std::cout << "What is the e-mail adress?";
    std::cin >> newEmail;
    email = newEmail;
    std::cout << "E-mail has been set." << std::endl;
}


bool Person::hasAvalibaleSeats() const {
    if (car != nullptr) { //check if there is a car
        return car->hasFreeSeats(); 
    }
    return false; 
}



std::ostream& operator << (std::ostream& os, const Person& p) {
    std::string seats = "No";
    if (p.hasAvalibaleSeats())
        seats = "Yes";
    return os << "Name: " << p.name << "\nE-mail: " << p.email << "\nHas free seats: " << seats << std::endl;
}

//From main im calling
#include "Car.h"
#include "Person.h"

int main() {
    Car ferrari{ 2 };
    Car bugatti{ 3 };
    Car jeep{0};


    Person one{ "Aleksander","aleks@aleks.com", &ferrari };
    Person two{ "Sara","sara@sara.com", &bugatti };
    Person three{ "Daniel", "daniel@daniel.com", &jeep };
    Person four{ "Chris", "chris@chris.com" };

    std::cout << one << std::endl;
    std::cout << two << std::endl;
    std::cout << three << std::endl;
    std::cout << four << std::endl;
    system("pause");
    return 0;
}

Я получаю

Имя: Александр E-mail: aleks@aleks.com Имеет свободные места: Да

Имя: Сара E-mail: sara@ sara.com Свободных мест: Да

Имя: Даниэль E-mail: daniel@daniel.com Свободных мест: Да

Имя: Крис E-mail: chris@chris.comЕсть свободные места: Нет

Но я хочу, чтобы у Даниэля было свободное место, чтобы быть "Нет"

Ответы [ 2 ]

9 голосов
/ 15 октября 2019

Здесь есть опечатка:

Car::Car(unsigned int freeSeas) :
    freeSeats{ freeSeats }
    {}

Вы написали freeSeas вместо freeSeats. В связи с этим параметр freeSeas не используется, а freeSeats{ freeSeats } ничего не делает, поскольку freeSeats ссылается на переменную-член, а не на параметр.

6 голосов
/ 15 октября 2019

Отладка намного проще при включении предупреждений компилятора. Компилятор - ваш друг, и он вам очень поможет, если вы захотите его услышать.

Например, gcc дал мне следующие предупреждения при компиляции вашего кода:

prog.cc: In constructor 'Car::Car(unsigned int)':
prog.cc:37:23: warning: unused parameter 'freeSeas' [-Wunused-parameter]
 Car::Car(unsigned int freeSeas) :
          ~~~~~~~~~~~~~^~~~~~~~
prog.cc: In constructor 'Car::Car(unsigned int)':
prog.cc:38:16: warning: '*<unknown>.Car::freeSeats' is used uninitialized in this function [-Wuninitialized]
     freeSeats{ freeSeats }
                ^~~~~~~~~

Iне нужно все понимать, но он говорит мне 2 вещи:

  1. Существует неиспользованный аргумент (почему? он используется для инициализации ...)
  2. Переменная инициализируется с помощьюнеинициализированное значение (почему?)

Это заставило меня присмотреться к этому конструктору, и тогда вы сможете увидеть опечатку.

...