#include <iostream> using namespace std; class Vehicle { public: Vehicle(float speed=0,int total=0) { Vehicle::speed = speed; Vehicle::total = total; } protected: float speed;//速度 int total;//最大载人量 }; class Motor { public: Motor(char *motor) { Motor::motortype = motor; } char* SMT(Motor &temp); protected: char *motortype;//发动机型号 }; char* Motor::SMT(Motor &temp) { return temp.motortype; } class Car:public Vehicle//继承的体现 { public: Car(float speed,int total,int aird,char *motortype):Vehicle(speed,total),motor(motortype) { Car::aird = aird; } Motor rm(Car &temp); protected: int aird;//排量 Motor motor;//类组合的体现 }; Motor Car::rm(Car &temp) { return temp.motor; } //-------------------------------------------------------------- void test1(Vehicle &temp) { //中间过程省略 cout<<"qinbin"<<endl; }; void test2(Motor &temp) { cout<<temp.SMT(temp);//读者这里注意一下,temp既是对象也是对象方法的形参 } //-------------------------------------------------------------- int main() { Car a(150,4,250,"奥地利AVL V8"); test1(a); // test2(a);//错误,Car类与Motor类无任何继承关系 //test2(a.rm(a));//如果Car类成员是public的那么可以使用test2(a.motor) Motor test =a.rm(a); 这2步正确,而上面一步不对,是因为引用 临时存储,所以储存下来就对了 编译器问题 test2(test); cin.get(); }
Motor& rm(Car &temp); Motor& Car::rm(Car &temp) { return temp.motor; } 改这2步,也会正确
据说是编译器问题,而不是说的 局部变量被销毁的问题。而是编译器不支持在函数内增加自创对象,并且自动转换为对象引用的问题。很常用!