之前自己常用如下方法建立类图
这是之前的方法,其实不应该这样,应该建立一个empty的project
选择model --> profile
选择C++ Profile和UML Standard Profile
把项目的名字改一下
右键点击,选择Add --> Model
改个名字
再改个名字,就默认出来了类的那些选项卡了
下面开始画了,我们先来看一个最最简单的类吧,如下:
Fund.h
1 class Fund 2 { 3 public: 4 Fund(float); 5 float getPrice(); 6 private: 7 float price; 8 };
Fund.cpp
1 Fund::Fund(float thePrice) 2 { 3 price=thePrice; 4 } 5 6 float Fund::getPrice() 7 { 8 return price; 9 }
单击出现的price
这就算自动更新完毕了
我们的一个函数也就如此完成了
这种我们就直接输入getPrice(): float,免得一堆麻烦事情!
然后我们再来看一个类,如下:
Bid.h
1 class Bid 2 { 3 public: 4 void setFund(Fund*); 5 virtual int calcAsset()=0; 6 virtual float getUnit()=0; 7 protected: 8 Fund *fundObj; 9 };
Bid.cpp
1 void Bid::setFund(Fund *theFund) 2 { 3 fundObj=theFund; 4 }
对于抽象类,我们选中右边的IsAbstract
type只能手动填写了
指定某个函数是抽象操作
相同的东西我们不再赘述了,直接搞就得了
下面我们来建立类Bid和类Fund的关系吧
下面再搞其他的类,定义如下:
RegularBid.h
1 class RegularBid : public Bid 2 { 3 public: 4 RegularBid(); 5 int calcAsset(); 6 float getUnit(); 7 8 private: 9 vector<BidItem*> itemObj; 10 };
再来看类BidItem:
BidItem.h
1 class BidItem 2 { 3 public: 4 BidItem(float); 5 float getUnit(); 6 private: 7 float unit; 8 };
BidItem.cpp
1 BidItem::BidItem(float theUnit) 2 { 3 unit=theUnit; 4 } 5 6 float BidItem::getUnit() 7 { 8 return unit; 9 }
取消导航性,即不支持反向链接
然后再完成其他的类图
SingleBid.h
1 class SingleBid : public Bid 2 { 3 public: 4 SingleBid(float); 5 int calcAsset(); 6 float getUnit(); 7 private: 8 float unit; 9 };
SingleBid.cpp
1 SingleBid::SingleBid(float theUnit) 2 { 3 unit=theUnit; 4 } 5 6 int SingleBid::calcAsset() 7 { 8 return unit*fundObj->getPrice(); 9 } 10 11 float SingleBid::getUnit() 12 { 13 return unit; 14 }
Account.h
1 class Account 2 { 3 public: 4 void setBid(Bid*); 5 int calcAsset(); 6 private: 7 vector<Bid*> bidObj; 8 };
Account.cpp
1 void Account::setBid(Bid *theBid) 2 { 3 bidObj.push_back(theBid); 4 } 5 6 int Account::calcAsset() 7 { 8 int size,theAsset=0; 9 size=bidObj.size(); 10 for(int i=0;i<size;i++) 11 theAsset=theAsset+bidObj[i]->calcAsset(); 12 return theAsset; 13 }
图都画完了,然后可以导出C++文件,我们来看一下导出的文件和我们期望的文件的不同:
(1)Account.h
UML图中的表现形式和我们实际希望的代码还是有出入的……
(update 2017-10-29)该问题已解决,具体可以参见UML类图详解_关联关系_一对多,里面对未达到预期的原因做了详细解释以及规避方法
(2)Bid.h
达到预期
(3)BidItem.h
达到预期
(4)Fund.h
达到预期
(5)RegularBid.h
UML图中的表现形式和我们实际希望的代码还是有出入的……
(update 2017-10-29)该问题已解决,具体可以参见UML类图详解_组合关系,里面对未达到预期的原因做了详细解释以及规避方法
(6)SingleBid.h
达到预期
(update 2017-10-29)总结两点:
1、一旦类图里面包含了一次成员那么在XX端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在XX端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,XX端点处就是声明一下多重性,而不要再声明成员就可以了。这就可以解决上面两处生成的代码没有满足我们需求的问题。
2、本篇博客是刚接触UML时所写,图画得还是有些问题的,后来又重新研究了一下,重新汇总了一下,具体见UML类图详解_泛化关系。