effective c++ 38 通过复合塑模出has-a或者根据某物实现出

程序员小x大约 1 分钟C++C++effective c++读书笔记

effective c++ 38 通过复合塑模出has-a或者根据某物实现出

前面介绍过类和类之间的一种关系-继承。本节将介绍另一种类和类的关系-组合。其含义就是在某个类型中嵌入一个另外一个类的对象。

通过组合,我们可以实现出has-a或者is-implemented-in-terms-of。

分析

has-a的关系也很好理解, 例如一个Person类型,其中含有一些属性地址, 电话号码, 如下所示:

class Address{}class PhoneNumber {}class Person{
publicprivate:
    std::string name;
    Address address;
    PhoneNumber voicenumber;
    PhoneNumber faxNumber;
}

is-implemented-in-terms-of是组合的另一种用途。 我们有一个自定义的Set类,我们通过了list类型进行了实现。

template<class T>
class Set
{
public:
	bool member(const T& item) const;
	void insert(const T& item);
	void remove(const T& item);
	std::size_t size() const;

private:
	// Representation of the Set data.
	std::list<T> rep;
};


template<typename T>
bool Set<T>::member(const T& item) const
{
	return std::find(rep.begin(), rep.end(), item) != rep.end();
}

template<typename T>
void Set<T>::insert(const T& item)
{
	if (!member(item))
	{
		rep.push_back(item);
	}
}

template<typename T>
void Set<T>::remove(const T& item)
{
	// See Item42 for information on typename
	typename std::list<T>::iterator it = std::find(rep.begin(), rep.end(), item);

	if (it != rep.end())
	{
		rep.erase(it);
	}
}

template<typename T>
std::size_t Set<T>::size() const
{
	return rep.size();
}

总结

  • 复合的意义和public继承完全不同
  • 在应用域,复合意味has-a。在实现域,复合意味is-implemented-in-terms-of根据某物实现出。
Loading...