before.cxx
#include <iostream>
#include <list>
class Element {
public:
Element(int value): value(value) {};
void remove(void) {
std::cout << this->value << " has been removed." << std::endl;
}
private:
int value;
};
class Set {
public:
void remove(void) {
for (std::list<Set *>::iterator setIterator = setList.begin(); setIterator != setList.end(); ++setIterator) {
(**setIterator).remove();
}
setList.clear();
for (std::list<Element *>::iterator elementIterator = elementList.begin(); elementIterator != elementList.end(); ++elementIterator) {
(**elementIterator).remove();
}
elementList.clear();
}
void addSet(Set &set) {
setList.push_back(&set);
}
void addElement(Element &element) {
elementList.push_back(&element);
}
private:
std::list<Set *> setList;
std::list<Element *> elementList;
};
int main(void) {
Set set1;
set1.addElement(Element(2));
set1.addElement(Element(3));
Set set2;
set2.addElement(Element(1));
set2.addSet(set1);
set2.addElement(Element(4));
set2.remove();
return 0;
}
after.cxx
#include <iostream>
#include <list>
class _Element {
public:
virtual void remove(void) = 0;
};
class Element: public _Element {
public:
Element(int value): value(value) {};
void remove(void) {
std::cout << this->value << " has been removed." << std::endl;
}
private:
int value;
};
class Set: public _Element {
public:
void remove(void) {
for (std::list<_Element *>::iterator elementIterator = elementList.begin(); elementIterator != elementList.end(); ++elementIterator) {
(**elementIterator).remove();
}
elementList.clear();
}
void add(_Element &element) {
elementList.push_back(&element);
}
private:
std::list<_Element *> elementList;
};
int main(void) {
Set set1;
set1.add(Element(2));
set1.add(Element(3));
Set set2;
set2.add(Element(1));
set2.add(set1);
set2.add(Element(4));
set2.remove();
return 0;
}