Composition builds a larger object from smaller objects.

composition Composition means one class stores another class as a member field.

Composition

example
composition.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>

class Battery {
private:
    int charge;

public:
    Battery(int startingCharge) {
        charge = startingCharge;
    }

    void use(int amount) {
        charge -= amount;
    }

    int remaining() {
        return charge;
    }
};

class Robot {
private:
    std::string name;
    Battery battery;

public:
    Robot(std::string robotName, int startingCharge) : name(robotName), battery(startingCharge) {
    }

    void work(int minutes) {
        battery.use(minutes * 2);
    }

    void printStatus() {
        std::cout << "robot=" << name << std::endl;
        std::cout << "charge=" << battery.remaining() << std::endl;
    }
};

int main() {
    std::string robotName = "Bolt";
    int minutes = 3;

    Robot robot(robotName, 20);
    robot.work(minutes);
    robot.printStatus();
    return 0;
}
#include <iostream>
#include <string>

class Battery {
private:
    int charge;

public:
    Battery(int startingCharge) {
        charge = startingCharge;
    }

    void use(int amount) {
        charge -= amount;
    }

    int remaining() {
        return charge;
    }
};

class Robot {
private:
    std::string name;
    Battery battery;

public:
    Robot(std::string robotName, int startingCharge) : name(robotName), battery(startingCharge) {
    }

    void work(int minutes) {
        battery.use(minutes * 2);
    }

    void printStatus() {
        std::cout << "robot=" << name << std::endl;
        std::cout << "charge=" << battery.remaining() << std::endl;
    }
};

int main() {
    std::string robotName = "Ivy";
    int minutes = 3;

    Robot robot(robotName, 20);
    robot.work(minutes);
    robot.printStatus();
    return 0;
}
#include <iostream>
#include <string>

class Battery {
private:
    int charge;

public:
    Battery(int startingCharge) {
        charge = startingCharge;
    }

    void use(int amount) {
        charge -= amount;
    }

    int remaining() {
        return charge;
    }
};

class Robot {
private:
    std::string name;
    Battery battery;

public:
    Robot(std::string robotName, int startingCharge) : name(robotName), battery(startingCharge) {
    }

    void work(int minutes) {
        battery.use(minutes * 2);
    }

    void printStatus() {
        std::cout << "robot=" << name << std::endl;
        std::cout << "charge=" << battery.remaining() << std::endl;
    }
};

int main() {
    std::string robotName = "Max";
    int minutes = 3;

    Robot robot(robotName, 20);
    robot.work(minutes);
    robot.printStatus();
    return 0;
}
#include <iostream>
#include <string>

class Battery {
private:
    int charge;

public:
    Battery(int startingCharge) {
        charge = startingCharge;
    }

    void use(int amount) {
        charge -= amount;
    }

    int remaining() {
        return charge;
    }
};

class Robot {
private:
    std::string name;
    Battery battery;

public:
    Robot(std::string robotName, int startingCharge) : name(robotName), battery(startingCharge) {
    }

    void work(int minutes) {
        battery.use(minutes * 2);
    }

    void printStatus() {
        std::cout << "robot=" << name << std::endl;
        std::cout << "charge=" << battery.remaining() << std::endl;
    }
};

int main() {
    std::string robotName = "Bolt";
    int minutes = 1;

    Robot robot(robotName, 20);
    robot.work(minutes);
    robot.printStatus();
    return 0;
}
#include <iostream>
#include <string>

class Battery {
private:
    int charge;

public:
    Battery(int startingCharge) {
        charge = startingCharge;
    }

    void use(int amount) {
        charge -= amount;
    }

    int remaining() {
        return charge;
    }
};

class Robot {
private:
    std::string name;
    Battery battery;

public:
    Robot(std::string robotName, int startingCharge) : name(robotName), battery(startingCharge) {
    }

    void work(int minutes) {
        battery.use(minutes * 2);
    }

    void printStatus() {
        std::cout << "robot=" << name << std::endl;
        std::cout << "charge=" << battery.remaining() << std::endl;
    }
};

int main() {
    std::string robotName = "Bolt";
    int minutes = 5;

    Robot robot(robotName, 20);
    robot.work(minutes);
    robot.printStatus();
    return 0;
}
  1. robotName ← Bolt, minutes ← 3

    41int main() {42    std::string robotName→ Bolt = "Bolt"; //@robotName="Ivy", "Max"43    int minutes→ 3 = 3; //@minutes=1, 54445    Robot robot(robotNameBolt, 20);46    robot.work(minutes);
  2. charge ← 20

    8public:9    Battery(int startingCharge20) {10        charge→ 20 = startingCharge20;11    }
  3. Robot(std::string robotName, int startingCharge) : name(robotName), ba…

    27public:28    Robot(std::string robotNameBolt, int startingCharge20) : name(robotName), battery(startingCharge) {29    }
  4. robot ← (empty)

    45Robot robot→ (empty)(robotNameBolt, 20);46robot(empty).work(minutes3);47robot.printStatus();
  5. void work(int minutes)

    31void work(int minutes3) {32    battery.use(minutes3 * 2);33}
  6. charge ← 14

    13void use(int amount6) {14    charge→ 14 -= amount6;15}
  7. battery.use(minutes * 2);

    31void work(int minutes) {32    battery.use(minutes3 * 2);33}
  8. robot.work(minutes);

    45Robot robot(robotName, 20);46robot(empty).work(minutes3);47robot(empty).printStatus();48return 0;
  9. void printStatus()

    35void printStatus() {36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputrobot=Bolt
  10. int remaining()

    17int remaining() {18    return charge14;19}
  11. std::cout << "charge=" << battery.remaining() << std::endl;

    36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputcharge=14
  12. robot.printStatus();

    46    robot.work(minutes);47    robot(empty).printStatus();48    return 0;49}
  1. robotName ← Ivy, minutes ← 3

    41int main() {42    std::string robotName→ Ivy = "Ivy";43    int minutes→ 3 = 3;4445    Robot robot(robotNameIvy, 20);46    robot.work(minutes);
  2. charge ← 20

    8public:9    Battery(int startingCharge20) {10        charge→ 20 = startingCharge20;11    }
  3. Robot(std::string robotName, int startingCharge) : name(robotName), ba…

    27public:28    Robot(std::string robotNameIvy, int startingCharge20) : name(robotName), battery(startingCharge) {29    }
  4. robot ← (empty)

    45Robot robot→ (empty)(robotNameIvy, 20);46robot(empty).work(minutes3);47robot.printStatus();
  5. void work(int minutes)

    31void work(int minutes3) {32    battery.use(minutes3 * 2);33}
  6. charge ← 14

    13void use(int amount6) {14    charge→ 14 -= amount6;15}
  7. battery.use(minutes * 2);

    31void work(int minutes) {32    battery.use(minutes3 * 2);33}
  8. robot.work(minutes);

    45Robot robot(robotName, 20);46robot(empty).work(minutes3);47robot(empty).printStatus();48return 0;
  9. void printStatus()

    35void printStatus() {36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputrobot=Ivy
  10. int remaining()

    17int remaining() {18    return charge14;19}
  11. std::cout << "charge=" << battery.remaining() << std::endl;

    36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputcharge=14
  12. robot.printStatus();

    46    robot.work(minutes);47    robot(empty).printStatus();48    return 0;49}
  1. robotName ← Max, minutes ← 3

    41int main() {42    std::string robotName→ Max = "Max";43    int minutes→ 3 = 3;4445    Robot robot(robotNameMax, 20);46    robot.work(minutes);
  2. charge ← 20

    8public:9    Battery(int startingCharge20) {10        charge→ 20 = startingCharge20;11    }
  3. Robot(std::string robotName, int startingCharge) : name(robotName), ba…

    27public:28    Robot(std::string robotNameMax, int startingCharge20) : name(robotName), battery(startingCharge) {29    }
  4. robot ← (empty)

    45Robot robot→ (empty)(robotNameMax, 20);46robot(empty).work(minutes3);47robot.printStatus();
  5. void work(int minutes)

    31void work(int minutes3) {32    battery.use(minutes3 * 2);33}
  6. charge ← 14

    13void use(int amount6) {14    charge→ 14 -= amount6;15}
  7. battery.use(minutes * 2);

    31void work(int minutes) {32    battery.use(minutes3 * 2);33}
  8. robot.work(minutes);

    45Robot robot(robotName, 20);46robot(empty).work(minutes3);47robot(empty).printStatus();48return 0;
  9. void printStatus()

    35void printStatus() {36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputrobot=Max
  10. int remaining()

    17int remaining() {18    return charge14;19}
  11. std::cout << "charge=" << battery.remaining() << std::endl;

    36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputcharge=14
  12. robot.printStatus();

    46    robot.work(minutes);47    robot(empty).printStatus();48    return 0;49}
  1. robotName ← Bolt, minutes ← 1

    41int main() {42    std::string robotName→ Bolt = "Bolt";43    int minutes→ 1 = 1;4445    Robot robot(robotNameBolt, 20);46    robot.work(minutes);
  2. charge ← 20

    8public:9    Battery(int startingCharge20) {10        charge→ 20 = startingCharge20;11    }
  3. Robot(std::string robotName, int startingCharge) : name(robotName), ba…

    27public:28    Robot(std::string robotNameBolt, int startingCharge20) : name(robotName), battery(startingCharge) {29    }
  4. robot ← (empty)

    45Robot robot→ (empty)(robotNameBolt, 20);46robot(empty).work(minutes1);47robot.printStatus();
  5. void work(int minutes)

    31void work(int minutes1) {32    battery.use(minutes1 * 2);33}
  6. charge ← 18

    13void use(int amount2) {14    charge→ 18 -= amount2;15}
  7. battery.use(minutes * 2);

    31void work(int minutes) {32    battery.use(minutes1 * 2);33}
  8. robot.work(minutes);

    45Robot robot(robotName, 20);46robot(empty).work(minutes1);47robot(empty).printStatus();48return 0;
  9. void printStatus()

    35void printStatus() {36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputrobot=Bolt
  10. int remaining()

    17int remaining() {18    return charge18;19}
  11. std::cout << "charge=" << battery.remaining() << std::endl;

    36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputcharge=18
  12. robot.printStatus();

    46    robot.work(minutes);47    robot(empty).printStatus();48    return 0;49}
  1. robotName ← Bolt, minutes ← 5

    41int main() {42    std::string robotName→ Bolt = "Bolt";43    int minutes→ 5 = 5;4445    Robot robot(robotNameBolt, 20);46    robot.work(minutes);
  2. charge ← 20

    8public:9    Battery(int startingCharge20) {10        charge→ 20 = startingCharge20;11    }
  3. Robot(std::string robotName, int startingCharge) : name(robotName), ba…

    27public:28    Robot(std::string robotNameBolt, int startingCharge20) : name(robotName), battery(startingCharge) {29    }
  4. robot ← (empty)

    45Robot robot→ (empty)(robotNameBolt, 20);46robot(empty).work(minutes5);47robot.printStatus();
  5. void work(int minutes)

    31void work(int minutes5) {32    battery.use(minutes5 * 2);33}
  6. charge ← 10

    13void use(int amount10) {14    charge→ 10 -= amount10;15}
  7. battery.use(minutes * 2);

    31void work(int minutes) {32    battery.use(minutes5 * 2);33}
  8. robot.work(minutes);

    45Robot robot(robotName, 20);46robot(empty).work(minutes5);47robot(empty).printStatus();48return 0;
  9. void printStatus()

    35void printStatus() {36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputrobot=Bolt
  10. int remaining()

    17int remaining() {18    return charge10;19}
  11. std::cout << "charge=" << battery.remaining() << std::endl;

    36    std::cout << "robot=" << name << std::endl;37    std::cout << "charge=" << battery.remaining() << std::endl;38}
    outputcharge=10
  12. robot.printStatus();

    46    robot.work(minutes);47    robot(empty).printStatus();48    return 0;49}