2016-12-16 4 views
0

J'ai cette classe abstraite en C++:C++ Appel automatique des méthodes de contrôle de la classe abstraite parent dans les méthodes virtuelles pures implémentées?

class A { 
public: 
    A(int size); 
    virtual void doSomething(int inputSize) = 0; 
protected: 
    virtual bool checkSize(int inputSize); 
private: 
    int size; 
} 

A::A(int size) : size(size){} 
bool A::checkSize(int inputSize) { return size == inputSize; } 

Maintenant, ce que je veux garantir est que pour chaque classe B dérivée de AdoSomething commence comme ceci:

class B : public A{ 
    void doSomething(int inputSize); 
} 

void B::doSomething(int inputSize){ 
    if(!checkSize(inputSize)){ 
    std::cerr<<"wrong inputSize!"<<std::endl; 
    return; 
    } 
    //do something... 
} 

Comment puis-je garantir que chaque classe dérivée de A implémente doSomething en commençant de cette façon?

+0

Il y a un (https://sourcemaking.com/design_patterns/template_method) [Méthode Modèle Design Pattern] – sameerkn

Répondre

5

vous divisez doSomething en deux parties:

class A { 
public: 
    void doSomething(int inputSize) { 
    if (!checkSize(inputSize)){ 
     std::cerr << "wrong inputSize!" << std::endl; 
     return; 
    } 
    doSomething_(inputSize); 
    } 
protected: 
    virtual void doSomething_(int) = 0; 
}; 

Et B vous ne mettre en œuvre doSomething_.

0

Vous pouvez faire le chèque directement A, quelque chose comme:

class A { 
public: 
    A(int size); 
    virtual ~A() = default; 

    void doSomething(int inputSize) 
    { 
     if (!checkSize(inputSize)){ 
      std::cerr<<"wrong inputSize!"<<std::endl; 
      return; 
     } 
     doSomethingWithChekedSize(inputSize); 
    } 

protected: 
    virtual void doSomethingWithChekedSize(int inputSize) = 0; 
    virtual bool checkSize(int inputSize); 
private: 
    int size; 
};