C++类组合问题

#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步,也会正确

据说是编译器问题,而不是说的 局部变量被销毁的问题。而是编译器不支持在函数内增加自创对象,并且自动转换为对象引用的问题。很常用!

C++类组合问题,布布扣,bubuko.com

时间: 2024-10-12 11:12:02

C++类组合问题的相关文章

python 类组合

在使用一款云产品的python sdk过程中,发现了python类之间调用的另一种少见方法:类组合,那么类组合是用来干吗的呢? 我们知道,在python中,类之间的相互调用,我们习惯性的采用继承的方法,但是 除了继承方法,我们还可以采用类组合的方式来调用另一个类 官方的说法:让不同的类混合并加入到其他类中,来增强功能和代码重用性.你可以在一个大点的类中创建你自己的类的实例,实现一些其他属性和方法来增强原来的类对象. 举个例子: >>> class Name(object):       

python3 类 组合

解决类与类之间代码冗余问题有两种解决方案: 第一 是继承,第二是组合 1:继承   描述的是类与类之间的也就是什么是什么的关系 2: 组合  描述的是类与类之间的关系,  是一种什么有什么的关系的,也可以说是一种从属关系, 一个类产生的对象,该对象拥有一个属性,这个属性的值是来自于另外一个类的对象. 原文地址:https://www.cnblogs.com/lx3822/p/8824581.html

Python进阶-----类组合的方式完成授权

授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能.其它的则保持原样.授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性. import time class FileHandle: def __init__(self,filename,mode = 'r',encoding = 'utf-8'): self.file = open(filename,mode,encoding=encod

第七章-复用类-组合语法

课后习题:练习1:创建一个简单的类,在第二个类中,将引用定义为第一个类的对象.运用惰性初始化来实例化这个对象. 我的答案: 一,个人. 1 package com.learnJava.test; 2 3 /** 4 * @Author zhuchangli 5 * @Date 2019/9/14 6 **/ 7 8 // 灶具 9 class Cooker{ 10 private String pot; // 锅 11 private String gas; // 煤气 12 Cooker(){

类组合涉及初始化问题

下面代码中,类B里组合了类A,运行时会报错, class A { public: A(int _a) { a = _a; cout << "构造函数" << "a" << a << endl; } ~A() { cout << "析构函数" << "a" << a << endl; } protected: private: int

Python mix-in 组合 ~ 将类组合起来 .

在一个池塘中有10个乌龟 1 条鱼 . 1 class Turtle: 2 def __init__(self,x): # 在生命对象的时候 说明对象的 数量 . (还是一个对象 . 数量只是该对象的一个属性 . ) 3 self.num=x 4 5 class Fish: 6 def __init__(self,x): 7 self.num=x 8 9 class Pool: 10 def __init__(self,x,y): 11 self.turtle=Turtle(x) #在该对象中定

类的组合

1.类的组合:类中的成员数据是另一个类的对象.类组合的构造函数:原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化. 2.构造函数的调用顺序: 1.调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造): 2.调用本类的构造函数 3.析构函数的调用顺序: 1.调用本类的析构函数: 2.调用内嵌对象的析构函数(按内嵌时的声明顺序,先声明者先析构). 4.若调用默认构造函数(即无形参的),则内嵌对象的初始化也将调用相应的默认构造函数. 5.类声明的方式有两种:使用前向引用声

计算机程序的思维逻辑 (14) - 类的组合【转】

正所谓,道生一,一生二,二生三,三生万物,如果将二进制表示和运算看做一,将基本数据类型看做二,基本数据类型形成的类看做三,那么,类的组合以及下节介绍的继承则使得三生万物. 上节我们通过类Point介绍了类的一些基本概念和语法,类Point中只有基本数据类型,但类中的成员变量的类型也可以是别的类,通过类的组合可以表达更为复杂的概念. 程序是用来解决现实问题的,将现实中的概念映射为程序中的概念,是初学编程过程中的一步跨越.本节通过一些例子来演示,如何将一些现实概念和问题,通过类以及类的组合来表示和处

计算机程序的思维逻辑 (14) - 类的组合

正所谓,道生一,一生二,二生三,三生万物,如果将二进制表示和运算看做一,将基本数据类型看做二,基本数据类型形成的类看做三,那么,类的组合以及下节介绍的继承则使得三生万物. 上节我们通过类Point介绍了类的一些基本概念和语法,类Point中只有基本数据类型,但类中的成员变量的类型也可以是别的类,通过类的组合可以表达更为复杂的概念. 程序是用来解决现实问题的,将现实中的概念映射为程序中的概念,是初学编程过程中的一步跨越.本节通过一些例子来演示,如何将一些现实概念和问题,通过类以及类的组合来表示和处