【问题标题】:How to pass private integer from Class A to another Int Variable in Class B in C++如何将私有整数从 A 类传递到 C++ 中 B 类中的另一个 Int 变量
【发布时间】:2019-11-16 20:04:01
【问题描述】:

基本上,我有 2 个课程,“汽车”和“汽车”。 "Car" 有 setMotor,它应该接受一个 Motor 对象,当一个电机已经可用时,并继承电机的功率并通过对电机具有的每个 PS 说 "brum" 来输出它的功率。如果 "powerofmotor" 为 3,则调用 move 函数时汽车必须发出 "brumbrumbrum"。

我使用的是 Codeblocks,所以代码示例分为头文件、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;
}

ma​​in.cpp

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

使用下面的代码,我得到“错误:从 'Motor*' 到 'int' 的无效对话 [-fpermissive]"

如果我输入“c1 -> setMotor(*m1) 然后我得到“我在没有电机的情况下移动”,所以基本上调用了 else 语句。

预期的输出应该是“BrumBrumBrum”,因为在我为它分配了一个 3PS 的电机后,汽车应该有 3PS。

【问题讨论】:

  • 顺便说一句,C++ 不是 C# 也不是 Java。您不需要为每个对象使用new
  • 这是我的一个问题。你为什么要使用new
  • 您的Car 类没有任何Motor 成员,因此setMotor 方法是无用的。
  • 最好提供minimal reproducible example(关注最小)。您展示的一半代码(例如所有包含的内容)对于解释问题没有必要,只会让其他人更难深入了解相关内容并为您提供帮助。
  • 为什么MotorCar 的朋友?如果您正在为汽车建模,那么Motor 应该是Car 的成员,因为Car has-a Motor。您通常不会看到电机断开(并且位于外部、任何地方)的运行汽车(例如friend 关系)。

标签: c++ class inheritance parameter-passing


【解决方案1】:

您正在将指向 Motor(Motor*) 的指针传递给函数 void setMotor(Motor m);,而它需要一个值类型 (Motor)。

将主函数中的Motor* m1 = new Motor(3); 更改为Motor m1(3);


如果仅出于某种原因需要传递指针,则将 c1-&gt;setMotor(m1); 更改为 c1-&gt; setMotor(*m1); 但这会创建对象的副本,因为您没有使用引用或将 void setMotor(Motor m); 的签名更改为 @987654329 @如下图。

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

【讨论】:

  • 我需要根据教授给定的 main.cpp 文件来构建我的函数。如何编写 setMotor 以正确获取指针?
  • @informatiker 我已根据您的要求更新了答案。我建议您通过指针、值和引用类型来更好地理解这些概念。
  • 或者,还有setMotor(*m1)
  • OP:应优先考虑参考。指针可以指向任何地方,包括无效位置(地址)。引用指向已知的现有对象。
  • @SolidMercury 起初我找不到 OP 说的地方,然后我读了我之前的 cmets,哈哈。现在这是有道理的。不过,总的来说,这是解决问题的另一种方法,前提是您可以更改主要内容(对于将来阅读本文的任何人)。
【解决方案2】:

既然心情好,就给你点基础:

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 构造,或者您可以使用您选择的Motor 构造Car

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;
}

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 2016-03-01
    • 2020-11-01
    • 2020-10-13
    • 2014-01-03
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多