mirror of
https://github.com/JakubVojvoda/design-patterns-cpp.git
synced 2025-12-18 05:14:36 +03:00
code refactoring: fix memory leaks, code style, etc.
This commit is contained in:
@@ -19,10 +19,13 @@ class ConcreteElementB;
|
||||
* declares a Visit operation for each class of ConcreteElement
|
||||
* in the object structure
|
||||
*/
|
||||
class Visitor {
|
||||
class Visitor
|
||||
{
|
||||
public:
|
||||
virtual void visitElementA(ConcreteElementA *element) = 0;
|
||||
virtual void visitElementB(ConcreteElementB *element) = 0;
|
||||
virtual ~Visitor() {}
|
||||
|
||||
virtual void visitElementA( ConcreteElementA* const element ) = 0;
|
||||
virtual void visitElementB( ConcreteElementB* const element ) = 0;
|
||||
// ...
|
||||
};
|
||||
|
||||
@@ -32,25 +35,35 @@ public:
|
||||
* a fragment of the algorithm defined for the corresponding class
|
||||
* of object in the structure
|
||||
*/
|
||||
class ConcreteVisitor1 : public Visitor {
|
||||
class ConcreteVisitor1 : public Visitor
|
||||
{
|
||||
public:
|
||||
void visitElementA(ConcreteElementA *) {
|
||||
~ConcreteVisitor1() {}
|
||||
|
||||
void visitElementA( ConcreteElementA* const )
|
||||
{
|
||||
std::cout << "Concrete Visitor 1: Element A visited." << std::endl;
|
||||
}
|
||||
|
||||
void visitElementB(ConcreteElementB *) {
|
||||
|
||||
void visitElementB( ConcreteElementB* const )
|
||||
{
|
||||
std::cout << "Concrete Visitor 1: Element B visited." << std::endl;
|
||||
}
|
||||
// ...
|
||||
};
|
||||
|
||||
class ConcreteVisitor2 : public Visitor {
|
||||
class ConcreteVisitor2 : public Visitor
|
||||
{
|
||||
public:
|
||||
void visitElementA(ConcreteElementA *) {
|
||||
~ConcreteVisitor2() {}
|
||||
|
||||
void visitElementA( ConcreteElementA* const )
|
||||
{
|
||||
std::cout << "Concrete Visitor 2: Element A visited." << std::endl;
|
||||
}
|
||||
|
||||
void visitElementB(ConcreteElementB *) {
|
||||
|
||||
void visitElementB( ConcreteElementB* const )
|
||||
{
|
||||
std::cout << "Concrete Visitor 2: Element B visited." << std::endl;
|
||||
}
|
||||
// ...
|
||||
@@ -60,9 +73,12 @@ public:
|
||||
* Element
|
||||
* defines an accept operation that takes a visitor as an argument
|
||||
*/
|
||||
class Element {
|
||||
class Element
|
||||
{
|
||||
public:
|
||||
virtual void accept(Visitor &visitor) = 0;
|
||||
virtual ~Element() {}
|
||||
|
||||
virtual void accept( Visitor &visitor ) = 0;
|
||||
// ...
|
||||
};
|
||||
|
||||
@@ -70,18 +86,26 @@ public:
|
||||
* Concrete Elements
|
||||
* implement an accept operation that takes a visitor as an argument
|
||||
*/
|
||||
class ConcreteElementA : public Element {
|
||||
class ConcreteElementA : public Element
|
||||
{
|
||||
public:
|
||||
void accept(Visitor &visitor) {
|
||||
visitor.visitElementA(this);
|
||||
~ConcreteElementA() {}
|
||||
|
||||
void accept( Visitor &visitor )
|
||||
{
|
||||
visitor.visitElementA( this );
|
||||
}
|
||||
// ...
|
||||
};
|
||||
|
||||
class ConcreteElementB : public Element {
|
||||
class ConcreteElementB : public Element
|
||||
{
|
||||
public:
|
||||
void accept(Visitor &visitor) {
|
||||
visitor.visitElementB(this);
|
||||
~ConcreteElementB() {}
|
||||
|
||||
void accept( Visitor &visitor )
|
||||
{
|
||||
visitor.visitElementB( this );
|
||||
}
|
||||
// ...
|
||||
};
|
||||
@@ -91,15 +115,15 @@ int main()
|
||||
{
|
||||
ConcreteElementA elementA;
|
||||
ConcreteElementB elementB;
|
||||
|
||||
|
||||
ConcreteVisitor1 visitor1;
|
||||
ConcreteVisitor2 visitor2;
|
||||
|
||||
|
||||
elementA.accept(visitor1);
|
||||
elementA.accept(visitor2);
|
||||
|
||||
|
||||
elementB.accept(visitor1);
|
||||
elementB.accept(visitor2);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user