基本上,我有2个班级,“汽车”和“汽车”。 “汽车”具有setMotor,当已经有电动机可用时,该setMotor应该接收电动机对象,并继承电动机的功率并通过为电动机具有的每个PS说“ brum”来输出其功率。如果“ powerofmotor”为3,则在调用move函数时,汽车必须制作“ 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;
}
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();
}
使用下面的代码,我得到“错误:从'Motor *'到'int'的无效对话 [-fpermissive]“
如果我键入“ c1-> setMotor(* m1),那么我会得到”我在没有电动机的情况下运动”,因此基本上调用了else语句。
预期输出应为“ BrumBrumBrum”,因为在我为其分配了3PS的电动机之后,汽车应具有3PS。
答案 0 :(得分:2)
您正在将指向Motor(Motor*
)的指针传递给函数void setMotor(Motor m);
,当它期望值类型为{Motor
)时。
将主要功能中的Motor* m1 = new Motor(3);
更改为Motor m1(3);
。
如果仅出于某种原因需要传递指针,则可以将c1->setMotor(m1);
更改为c1-> setMotor(*m1);
,但这将创建对象的副本,因为您没有使用引用或更改了{{ 1}}到void setMotor(Motor m);
,如下所示。
void setMotor(Motor* m);
答案 1 :(得分: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;
};
在上面的示例中,可以使用 default 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;
}