Как передать личное целое число из класса A в другую переменную Int в классе B в C ++ - PullRequest
1 голос
/ 06 июля 2019

В принципе, у меня есть 2 класса: «Автомобиль» и «Мотор».«Car» имеет setMotor, который должен принимать объект Motor, когда двигатель уже доступен, и наследовать мощность двигателя и выводить его мощность, говоря «brum» для каждой PS, имеющейся в двигателе.Если «powerofmotor» равен 3, то автомобиль должен сделать «brumbrumbrum» при вызове функции перемещения.

Я использую кодовые блоки, поэтому примеры кода делятся на заголовки, файлы cpp и основной файл.

Заголовки:

car.h

class Car:
{

public:


    void setMotor(Motor m);
    void move();
    Car();

private:    
    int powerofcar = 0;
};

motor.h

class Motor{

friend class Car;

public:
    Motor();
    Motor(int p); //assign the power -> Motor(3) has 3 PS

private:
    int powerofmotor = 0;

}

Файлы Cpp:

car.cpp

Car::Car(){
}

void Car::setMotor(Motor m){

powerofcar = m.powerofmotor;


}

void Car::move(){


if(powerofcar != 0){
    for(int i = 0; i < powerofcar; i++){
        cout << "Brum";
    }
cout << endl;
}


else {
    cout << "i move without a motor" << endl;

}
}

motor.cpp

using namespace std;


Motor::Motor(){
}


Motor::Motor(int p){

powerofmotor = p;
}

main.cpp

int main()
{
Motor* m1 = new Motor(3);
Car *c1 = new Car;
c1 -> setMotor(m1); // <--- doesnt work "converation error"
c1 -> move();
}

Используя приведенный ниже код, я получаю сообщение «error: недопустимый разговор с« Motor * »на« int »[-fpermissive]"

, если я набираю "c1 -> setMotor (* m1), тогда я получаю «я двигаюсь без мотора», поэтому в основном вызывается оператор else.

Ожидаемый результат должен быть «BrumBrumBrum», потому что у автомобиля должно быть 3PS после того, как я назначумотор с 3PS к нему.

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Так как у меня хорошее настроение, я дам вам немного основы:

class Motor
{
  public:
    Motor(int power)
    : m_power(power)
    { ; }

    Motor() : m_power(0) { }

    int get_power()
    { return m_power;}

  private:
    int m_power;
};

class Car
{
  public:  
    Car()
    { ; }

    Car(Motor& m)
    : m_motor(m)
    { ; }

    get_power()
    {
      return m_motor.get_power();
    }
  private:
    Motor m_motor;
};

В приведенном выше примере Car может быть построен с по умолчанию Motor, или вы можете создать Car с Motor по вашему выбору:

int main()
{
  Car ford_edge;  // Car with default motor.
  Motor v16(16);  // Create a v-16 motor.
  Car muscle_car(v16);  // Create a muscle car with a v16 motor.
  cout <<  "Muscle car has power of: "
       <<  muscle_car.get_power() << "\n";
  return 0;
}
2 голосов
/ 06 июля 2019

Вы передаете указатель на двигатель (Motor*) для функции void setMotor(Motor m);, когда он ожидает тип значения (Motor).

Измените Motor* m1 = new Motor(3); в основной функции на Motor m1(3);.


Если вам нужно передать указатель только по какой-то причине, то вы измените c1->setMotor(m1); на c1-> setMotor(*m1);, но это создаст копию объекта, так как вы не используете ссылку, или измените подпись void setMotor(Motor m); на void setMotor(Motor* m); как показано ниже.

void Car::setMotor(Motor * m) {
    powerofcar = m->powerofmotor;
}
...