基本上,我有两个类,"汽车"one_answers"电动机"。"汽车"具有SETMOTOR,当电动机已经可用时,应该接收电机对象,并通过对电动机具有的每个PS说" brum"来继承电动机的功率并输出其功率。如果" PowerOformotor"为3,则在调用移动功能时,汽车必须制作" brumbrum"。
我正在使用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;
}
main.cpp
int main()
{
Motor* m1 = new Motor(3);
Car *c1 = new Car;
c1 -> setMotor(m1); // <--- doesnt work "converation error"
c1 -> move();
}
使用下面的代码我获得"错误:从'电机*'到'int'的无效对话 [-fpermissive]"
如果我键入" c1-> setMotor(*m1(,那么我会得到"我在没有电动机的情况下移动",因此基本上调用了其他语句。
预期的输出应为" brumbrum",因为在我为其分配3PS的电动机后,汽车应具有3PS。
由于我心情愉快,我会给你一些基础:
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
可以使用A default 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;
}
您将指针传递给电动机(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;
}