Я ищу чистый язык C ++ для следующей ситуации:
class SomeLibraryClass {
public:
SomeLibraryClass() { /* start initialization */ }
void addFoo() { /* we are a collection of foos */ }
void funcToCallAfterAllAddFoos() { /* Making sure this is called is the issue */ }
};
class SomeUserClass : public SomeLibraryClass {
public:
SomeUserClass() {
addFoo();
addFoo();
addFoo(); // SomeUserClass has three foos.
}
};
class SomeUserDerrivedClass : public SomeUserClass {
public:
SomeUserDerrivedClass() {
addFoo(); // This one has four foos.
}
};
Итак, я действительно хочу, чтобы SomeLibraryClass принудительно вызвал вызов funcToCallAfterAllAddFoos в конце процесса построения. Пользователь не может поместить его в конец SomeUserClass :: SomeUserClass (), что могло бы испортить SomeUserDerrivedClass. Если он помещает его в конец SomeUserDerrivedClass, то он никогда не вызывается для SomeUserClass.
Чтобы уточнить, что мне нужно, представьте, что / * начать инициализацию * / получает блокировку, а funcToCallAfterAllAddFoos () снимает блокировку.
Компилятор знает, когда все инициализации объекта выполнены, но могу ли я получить эту информацию с помощью какого-нибудь приятного трюка?