c++ - UML 模型关系是如何用 C++ 编码的?

标签 c++

这个问题在我的考试复习中,我想知道我是否在正确的轨道上,它来自 C++ primer 教科书。

UML 模型关系如何用 C++ 编码?

公共(public)继承允许您对 IS-A 关系进行建模,派生类能够重用基类的代码。另一种方法是使用包含,这是一个对象拥有或拥有另一个对象的对象之间的关系。这模拟了 HAS-A 关系。

例如:

  • 汽车有或拥有电机
  • 汽车造好后,它的马达也造好
  • 当 Car 被摧毁时,它的马达也被摧毁。

    class Car 
    {
        private:
            Motor *motor;
        public:
            Car()
            { 
                 motor = new Motor(); 
            }
    
            ~Car() 
            { 
                 delete motor; 
            }
    };
    

最佳答案

使用 C++ 比使用 Java 更容易建立组合关系。在最简单的情况下,包含的对象只是一个值成员:

class Car {
private:
  Motor motor;
  // No explicit construction/destruction required
};

当您想包含一个动态类型由调用者使用依赖注入(inject)确定的AbstractMotor 时,情况会变得更加复杂。要在这种情况下对组合进行建模,您可以使用 unique_ptr:

class Car {
public:
  explicit Car(std::unique_ptr<AbstractMotor> motor): motor(std::move(motor)) { }
private:
  std::unique_ptr<AbstractMotor> motor;  // Still no explicit destruction required
};

unique_ptr 确保您的CarMotor 的唯一所有者,并且Motor 的生命周期绑定(bind)到 Car 对象。

当一个对象拥有另一个对象时,尽量避免使用原始指针。使用 unique_ptr,根本不需要实现重要的析构函数或使用 delete 运算符。

关于c++ - UML 模型关系是如何用 C++ 编码的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101295/

相关文章:

c++ - '~' 在 C++ 中有什么用?

c++ - 请解释这个功能

c++ - Qt中如何绘制数据流图?

c++ - 如何保持二维数组的总计

c++ - 将 LPCWSTR 转换为 LPCSTR

c++ - C++ 中的容器协方差

c++ - std::async 参数的生命周期是多少?

c++ - 如果参数在编译时已知,我可以执行可选的 static_assert 吗?

c++ - 在 win32 中连续串行写入,C++

c++ - macOS High Sierra 上的非默认编译器(GCC 或 Vanilla-Clang)链接问题