RAII Shutdown Ordering

#include <iostream>
using namespace std;

class Clock {
public:
    Clock() {
        cout << "Clock enabled" << endl;
    }

    ~Clock() {
        cout << "Clock disabled" << endl;
    }
};

class Bus {
private:
    Clock* clock;
public:
    Bus(Clock* clk):clock(clk) {
        cout << "Bus initialized" << endl;
    }

    ~Bus() {
        cout << "Bus stopped" << endl;
    }

    void write(int addr, int val) {
        cout << "Bus write: " << addr << " " << val << endl;
    }
};

class Driver {
private:
    Bus* bus;
public:
    Driver(Bus* b):bus(b) {
        cout << "Driver started" << endl;
    }

    void operate(int addr, int val) {
        // perform bus write
        bus->write(addr,val);
    }

    ~Driver() {
        cout << "Driver stopped" << endl;
    }
};

class SystemController {
private:
    // SystemController must own Clock, Bus, and Driver
    Clock clock;
    Bus bus;
    Driver driver;
    // Dependencies must be wired here

public:
    // Constructor should set up dependencies
    SystemController():bus(&clock),driver(&bus){}

    void run(int addr, int val) {
        // trigger driver operation
        driver.operate(addr,val);
    }
};

int main() {
    int addr, val;
    cin >> addr >> val;

    {
        SystemController sys;
        sys.run(addr, val);
    }

    return 0;
}

Solving Approach

 

 

 

 

Upvote
Downvote
Loading...

Input

5 10

Expected Output

Clock enabled Bus initialized Driver started Bus write: 5 10 Driver stopped Bus stopped Clock disabled