Один метод, учитывая известное количество вызовов AddItemX (), состоит в том, чтобы переместить эти функции AddItem () в защищенные и иметь класс Collection, отслеживающий добавления и число, например:
(на самом деле яне нравится это решение, лол, но, учитывая ваш дизайн, этого будет достаточно:)
class X;
class Y;
class Collection
{
private:
int m_nItems;
int m_nItemsAdded;
protected:
virtual void AddItemXImpl(X&) = 0;
virtual void AddItemYImpl(Y&) = 0;
public:
Collection() : m_nItems(2), m_nItemsAdded(0){};
void AddItemX(X& _x) {m_nMethodsAdded++; AddItemXImpl(_x); };
void AddItemY(Y& _y) {m_nMethodsAdded++; AddItemYImpl(_y); };
// function to find out if we're filled
bool isFilled() const {return(m_nItemsAdded == m_nItems); };
}; // eo class Collection
РЕДАКТИРОВАТЬ: Для пояснения, ваш коллектор может быть реализован таким образом:
class Collector
{
protected:
virtual void FillImpl(Collection& _collection) = 0;
public:
void Fill(Collection& _collection)
{
FillImpl(_collection);
if(!_collection.isFilled())
throw(std::exception("Not filled dammit!"));
};
}; // eo class Collector