Как получить список всех объявленных классов, наследуемых от определенного класса в C ++ - PullRequest
1 голос
/ 10 сентября 2011

Я знаю, что это не совсем возможно в C ++, но, возможно, набор инструментов, который может генерировать код, который имеет функцию, которая при вызове дает мне список всех этих классов. Например, для нескольких файлов у меня есть такие вещи, как:

class MyClass : public ParticularClass {
    ....
}

class MyClass2 : public ParticularClass {
    ....
}

Затем, во время выполнения, я просто хочу указатель на отдельные экземпляры класса. Допустим, мой сгенерированный код выглядит примерно так:

void __populate_classes() {
    superList.append(new MyClass());
    superList.append(new MyClass2());
}

Кроме того, superList будет иметь тип List<ParticularClass*>. Кроме того, я буду использовать Qt и ParticularClass будет производным QObject, так что я могу в любом случае получить имя класса. Мне нужно в основном проанализировать класс, поэтому мой внутренний код не особо беспокоит вновь определенный тип.

Итак, есть ли способ сгенерировать этот код с помощью некоторого набора инструментов? Если это возможно только с qmake, это было бы как глазурь на офигенном пироге:)

Большое спасибо за ваше время.

Ответы [ 3 ]

2 голосов
/ 10 сентября 2011

Doxygen отлично справляется с этим - в автономном режиме.Различные IDE делают хорошую работу в этом - в автономном режиме.Компилятор этого не делает.Такие знания не нужны или не используются компилятором.

0 голосов
/ 10 сентября 2011

Я не думаю, что вы пытаетесь сделать, это хорошая идея.Тем, кто будет поддерживать код после вас, будет непросто понять его.

Возможно, вместо этого вы попробуете посмотреть, как это можно сделать в плане C ++.Одно из возможных решений, которое приходит мне на ум, - реализовать шаблон проектирования фабрики.Затем вы можете перебрать все типы данных на фабрике и затем добавить в superList .

Любым способом, используя ack (простая замена grep), если вывсегда объявляйте наследование в одной строке:

ack ": *public ParticularClass" *.h 
0 голосов
/ 10 сентября 2011

Здесь на работе я использую инструмент под названием Understand 4 C ++. Это инструмент, который поможет вам проанализировать ваш код. Это будет сделано довольно легко. Но моя любимая часть в том, что он поставляется с C и Perl API, который позволяет вам использовать преимущества абстрактного синтаксического дерева, которое «понимает», инкапсулирует и пишет ваши собственные инструменты статического анализа. Я написал тонны инструментов, использующих этот API.

В любом случае, это написано SciTools. http://scitools.com и я не работаю на них. Мне просто искренне нравится их продукт. На самом деле я написал C # API, который оборачивает их C API, и разместил его на CodePlex несколько лет назад. Конечно, с помощью C или Perl для написания инструментов статического анализа.

...