2015-10-22 29 views
6

Czy istnieje mechanizm umożliwiający egzekwowanie chronionego konstruktora w klasie pochodnej?Egzekwowanie chronionego konstruktora w klasie pochodnej

Prosty przykład:

template<typename T> 
class Factory; 

class Base { 
    template<typename T> 
    friend class Factory; 
protected: 
    Base(); 
}; 


class Child : public Base { 
public: 
    Child(); // this should lead to a compile time error 
}; 

<template T> 
class Factory { 
Base* GetNew() 
{ 
    BOOST_STATIC_ASSERT(boost::is_base_of<Base, T>::value); 

    Base* b = new T(); 
    b->doStuff(); 

    return b; 
} 
}; 

Więc chcę klasa dziecka do creatable wyłącznie przez fabrykę i egzekwowania, że ​​wszystkie klasy potomne wynikające z zasady posiada zabezpieczoną konstruktora.

Odpowiedz

4

Nie, nie ma sposobu na wymuszenie tego. Ogólnie rzecz biorąc, klasy bazowe są bardzo ograniczone w sposobie ograniczania podklas. Base nie jest i nie powinien być odpowiedzialny za nadzorowanie wszystkich, którzy kiedykolwiek mogą napisać klasę, która przypadkiem odziedziczyła po Base.

4

Krótka odpowiedź, nr rodzaj.

protected jest najmniej użytecznym specyfikatorem dostępu, ponieważ dowolna klasa pochodna może dowolnie udostępniać nazwę (łącznie z nazwą konstruktora).

Do czego można uzyskać do uzywania klucza dostępu w konstruktorze, aby zapewnić, że tylko fabryka tworzy klasę.

struct factory; 

// create_key's constructor is private, but the factory is a friend. 
class create_key 
{ 
    create_key() {}; 
    friend factory; 
}; 

struct only_from_factory 
{ 
    // base constructor demands a key is sent. Only a factory may create a key. 
    only_from_factory(const create_key&) {}; 
}; 
+0

Dzięki temu bardzo dobry pomysł. Tak naprawdę myślałem już o czymś podobnym. Chciałbym również przyjąć twoją odpowiedź, ale niestety mogę ją zaakceptować. – Chris

+1

To jest w porządku. Nie robię tego dla chwały. Robię to, ponieważ (a) pozwala mi to zachować czujność i (b) zdaję sobie sprawę, że C++ jest fantastycznym językiem i lubię, gdy się go dobrze używa. –

Powiązane problemy