Любой способ предотвратить динамическое размещение класса? - PullRequest
7 голосов
/ 08 июня 2011

Я использую базовый класс C ++ и подклассы (давайте назовем их A и B для ясности) в моей встроенной системе.

Это критично ко времени и пространству, поэтому мне действительно нужно, чтобы оно было как минимум минимальным.

Компилятор жалуется на отсутствие виртуального деструктора, что, как я понимаю, может помочь вамв беду, если вы выделите B*, а затем удалите указатель как экземпляр A*.

Но я никогда не собираюсь выделять какие-либо экземпляры этого класса.Есть ли способ, которым я могу перегрузить operator new() таким образом, чтобы он компилировался, если нет динамического размещения ни одного из классов, но вызывает ошибку компилятора, если конечный пользователь пытается выделить новые экземпляры A или B?

Я ищу похожий подход к общему способу «отравления» конструкторов автоматического копирования копий через частные конструкторы.(например, http://channel9.msdn.com/Forums/TechOff/252214-Private-copy-constructor-and-private-operator-C)

Ответы [ 3 ]

9 голосов
/ 08 июня 2011

Вы можете отравить operator new точно так же, как вы можете создать конструктор копирования. Только будьте уверены, чтобы не отравить помещение новым. Виртуальный деструктор все равно будет хорошей рекомендацией.

int main() {
    char data[sizeof(Derived)];
    if (condition)
        new (data) Derived();
    else
        new (data) Base();
    Base* ptr = reinterpret_cast<Base*>(&data[0]);
    ptr->~Base();
}
2 голосов
/ 08 июня 2011
class A
{
private:
    void *operator new(size_t);
    ...
};

elipses для других переопределений operator new и остальной части класса.

0 голосов
/ 08 июня 2011

Просто сделайте оператора новым личным

...