对于一对多的示例,可以想象一个账户可以多次申购。在申购的时候没有固定上限,下限为0,那么就可以使用容器类(container class)来搞,最常见的就是vector了。
下面我们来看一个“一对多”的例子
Account.h
#include <cstdlib>
#include <vector>
#include "Bid.h"
using namespace std; class Account
{
public:
void setBid(Bid*);
int calcAmount();
private:
vector<Bid*> bidObj;
};
声明一个存放申购交易对于指针的vector对象。然后类Account中的函数setBid设计了一个公有操作,让外界用来传入申购交易对象的指针,以便让账户对象将申购交易对象指针存入vector对象中。
Account.cpp
#include "Account.h" void Account::setBid(Bid *theBid)
{
bidObj.push_back(theBid);
} int Account::calcAmount()
{
int size,theAmount=;
size=bidObj.size();
for(int i=;i<size;i++)
theAmount=theAmount+bidObj[i]->getAmount();
return theAmount;
}
Bid.h
class Bid
{
public:
void setAmount(int);
int getAmount();
private:
int amount;
};
Bid.cpp
#include "Bid.h" void Bid::setAmount(int theAmount)
{
amount=theAmount;
} int Bid::getAmount()
{
return amount;
}
main.cpp
#include <cstdlib>
#include <iostream>
#include "Bid.h"
#include "Account.h"
using namespace std; int main(int argc, char *argv[])
{
Bid *myBid;
Account myAccount;
int theAmount;
int choice; do
{
cout << "请输入申购金额: ";
cin >> theAmount;
myBid=new Bid;
myBid->setAmount(theAmount);
myAccount.setBid(myBid);
cout << "1(继续), 2(结算) ...";
cin >> choice;
cout << endl;
} while(choice==); cout << "总投资金额为: "
<< myAccount.calcAmount() << endl << endl; system("PAUSE");
return EXIT_SUCCESS;
}
下面我们来画一下UML图,并且用UML自动生成C++代码来做一个比较
画法一:
生成代码对比
Account.h
没有达到预期,多生成了成员变量,如果在类图里面写明了某个指针变量的话,那么在关联关系的端点处就不能再标示这个成员变量了,否则就会重复生成
见UML类图详解_关联关系_多对一中的画法二,也是因为这个导致了没有达到预期
Bid.h
达到预期
画法二:
生成代码对比
Account.h
达到预期
Bid.h
达到预期
画法三:
生成代码对比
Account.h
没有达到预期
Bid.h
达到预期
综上所述,在实际画图的时候采用画法二才能保证正确,一旦类图里面包含了一次成员那么在关联端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在关联端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,关联端点处就是声明一下多重性,而不要再声明成员就可以了。