2016-12-16 2 views
0

У меня есть этот абстрактный класс в C++:C++ Автоматически вызывать методы проверки из родительского абстрактного класса в реализованных чистых виртуальных методах?

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; } 

Теперь, что я хочу, чтобы гарантировать, что для каждого класса B, полученного из AdoSomething начинается так:

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... 
} 

Как я могу гарантировать, что каждый производный класс от A реализует doSomething, начиная с этого пути?

+0

Существует а [Design Pattern Метод шаблона] (https://sourcemaking.com/design_patterns/template_method) – sameerkn

ответ

5

Вы разделить doSomething на две части:

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; 
}; 

И в B вы только реализовать doSomething_.

0

Вы можете сделать проверку в A непосредственно, что-то вроде:

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; 
}; 
Смежные вопросы