对于一对多的示例,可以想象一个账户可以多次申购。在申购的时候没有固定上限,下限为0,那么就可以使用容器类(container class)来搞,最常见的就是vector了。

下面我们来看一个“一对多”的例子

Account.h

  1. #include <cstdlib>
  2. #include <vector>
  3. #include "Bid.h"
  4. using namespace std;
  5.  
  6. class Account
  7. {
  8. public:
  9. void setBid(Bid*);
  10. int calcAmount();
  11. private:
  12. vector<Bid*> bidObj;
  13. };

声明一个存放申购交易对于指针的vector对象。然后类Account中的函数setBid设计了一个公有操作,让外界用来传入申购交易对象的指针,以便让账户对象将申购交易对象指针存入vector对象中。

Account.cpp

  1. #include "Account.h"
  2.  
  3. void Account::setBid(Bid *theBid)
  4. {
  5. bidObj.push_back(theBid);
  6. }
  7.  
  8. int Account::calcAmount()
  9. {
  10. int size,theAmount=;
  11. size=bidObj.size();
  12. for(int i=;i<size;i++)
  13. theAmount=theAmount+bidObj[i]->getAmount();
  14. return theAmount;
  15. }

Bid.h

  1. class Bid
  2. {
  3. public:
  4. void setAmount(int);
  5. int getAmount();
  6. private:
  7. int amount;
  8. };

Bid.cpp

  1. #include "Bid.h"
  2.  
  3. void Bid::setAmount(int theAmount)
  4. {
  5. amount=theAmount;
  6. }
  7.  
  8. int Bid::getAmount()
  9. {
  10. return amount;
  11. }

main.cpp

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include "Bid.h"
  4. #include "Account.h"
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. Bid *myBid;
  10. Account myAccount;
  11. int theAmount;
  12. int choice;
  13.  
  14. do
  15. {
  16. cout << "请输入申购金额: ";
  17. cin >> theAmount;
  18. myBid=new Bid;
  19. myBid->setAmount(theAmount);
  20. myAccount.setBid(myBid);
  21. cout << "1(继续), 2(结算) ...";
  22. cin >> choice;
  23. cout << endl;
  24. } while(choice==);
  25.  
  26. cout << "总投资金额为: "
  27. << myAccount.calcAmount() << endl << endl;
  28.  
  29. system("PAUSE");
  30. return EXIT_SUCCESS;
  31. }

下面我们来画一下UML图,并且用UML自动生成C++代码来做一个比较

画法一:

生成代码对比

Account.h

没有达到预期,多生成了成员变量,如果在类图里面写明了某个指针变量的话,那么在关联关系的端点处就不能再标示这个成员变量了,否则就会重复生成

UML类图详解_关联关系_多对一中的画法二,也是因为这个导致了没有达到预期

Bid.h

达到预期

画法二:

生成代码对比

Account.h

达到预期

Bid.h

达到预期

画法三:

生成代码对比

Account.h

没有达到预期

Bid.h

达到预期

综上所述,在实际画图的时候采用画法二才能保证正确,一旦类图里面包含了一次成员那么在关联端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在关联端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,关联端点处就是声明一下多重性,而不要再声明成员就可以了。

UML类图详解_关联关系_一对多的更多相关文章

  1. UML类图详解_关联关系_多对一

    首先先来明确一个概念,即多重性.什么是多重性呢?多重性是指两个对象之间的链接数目,表示法是“下限...上限”,最小数据为零(0),最大数目为没有设限(*),如果仅标示一个数目级上下限相同. 实际在UM ...

  2. UML类图详解_泛化关系

    泛化其实就是继承关系,还是比较简单的,那么我们就把之前有些问题的博客UML类图重新来实现一次. 依旧是这个图 下面我们来看一个例子 Account.h #include <cstdlib> ...

  3. UML类图详解

    下面是类图的实例: (注:飞翔接口那里应为空心三角形) UML中类图实例 接口:空心圆+直线(唐老鸭类实现了‘讲人话’):依赖:虚线+箭头(动物和空气的关系):关联:实线+箭头(企鹅需要知道气候才迁移 ...

  4. UML 类图详解

    转载来源:http://blog.csdn.net/shift_wwx/article/details/79205187 可以参考:http://www.uml.org.cn/oobject/2012 ...

  5. UML类图详解和示例

    ps:博客园markdown不能自动生成列表,更好的阅读体验可访问我的个人博客http://www.isspark.com/archives/UMLDescription UML类图概述 什么是UML ...

  6. UML类图详解_组合关系

    组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力.一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭.另外,外界也不能直接与 ...

  7. UML类图详解_关联关系_多对多

    在关联关系中,很多情况下我们的多重性并不是多对一或者一对多的,而是多对多的. 不过因为我们要考虑里面的导航性,如果直接搞的话就是需要去维护两群对象之间多对多的互指链接,这就十分繁杂且易错.那么我们怎么 ...

  8. UML类图详解_聚合关系

    结合UML关系,以看台和基金来介绍聚合关系 aggregation,是一种特殊的关联关系,既有关联关系的特质,还独有“整体 —— 部分(whole —— part)”的特质. 也就是说,用之前的关联关 ...

  9. UML简单介绍—类图详解

    类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...

随机推荐

  1. 5.4 集合的排序(Java学习笔记)(Collections.sort(),及Arrays.sort()底层分析)

    1.Comparable接口 这个接口顾名思义就是用于排序的,如果要对某些对象进行排序,那么该对象所在的类必须实现 Comparabld接口.Comparable接口只有一个方法CompareTo() ...

  2. a + b ——C语言初学者百题大战之四

    #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf(" ...

  3. sql字段字符用做其他类型查询

    select * FROM aa where parent = %@ ORDER BY cast(seq as integer) ASC

  4. 再谈EditText只能输入金额

    上次写了一篇EditText只能输入金额的博客,后来发现一个bug,当还未输入数字的情况下输入小数点程序就崩了,我去测了一下支付宝,看看会怎么样,我先输入小数点,程序正常,我再输入数字,可以正常输入, ...

  5. Android UI Material Design

    Material Design 中文版: http://wiki.jikexueyuan.com/project/material-design/ Material Design开发文章系列1:App ...

  6. 利用Cain+wireshark进行协议分析

    Cain抓包指南 1.简介: 在开发测试工作中经常有捕抓设备间通信报文的需求,但有时候被抓包的设备并不直接和进行抓包的主机或设备进行通信,因此会达不到想要的效果.解决该问题的常见方法有: (1).为被 ...

  7. 使用.Net中的WeakDictionary — ConditionalWeakTable

    有的时候,我们需要给某些数据添加一些附加信息,一种常用的做法是使用一个Dictionary在填充这些附加信息如: var data = new Data();    var tag = new Tag ...

  8. 【mybatis】idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin

    idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin,名字可能叫Free mybatis-plugin 安装上之后,可能需要重启ide ...

  9. adb logcat通过包名过滤(dos命令find后跟变量)

    adb命令中似乎没有直接通过报名来过滤的功能,可是能够通过过滤进程的pid来过滤该应用的日志 过滤条件:该app在执行 实现原理: 1.获取该app执行时的pid 2.通过find命令,过滤pid的日 ...

  10. UNDO表空间损坏导致数据库无法OPEN

    在数据库undo表空间文件损坏.或者undo表空间文件缺失的情况下.无法打开数据库. 这两种情况都能够视为一种情况处理,解决方法一样. 场景:在23:10的时候新建一个undo表空间undotbs02 ...