Новобранец C ++: как я могу хранить код для класса в вспомогательных / вспомогательных файлах, но при этом получать доступ ко всем функциям-членам класса? - PullRequest
0 голосов
/ 15 октября 2011

Я написал класс, который считывает данные из внешних файлов, манипулирует данными, а затем выполняет вычисления.

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

Я знаю, что было бы лучше разделить класс по стилю, но я использую его в сочетании с коммерческим кодом, который я не могу изменить.Кроме того, людям, которым нужно будет использовать код, нужен один класс + вспомогательные файлы, поэтому я ограничен этим одним классом.Чтобы сделать код более читабельным, я хотел бы сохранить часть кода из конструктора в вспомогательных файлах .cpp / .h, называемых «вспомогательные .h / .cpp», и обращаться к ним через функции.

Вот проблема:

1) Передача функций шаблона (функций-членов класса) в качестве аргументов функции во вспомогательные файлы.Я не могу этого сделать, хотя я слышал, что это возможно через нечто, называемое «устранение неоднозначности».Нет проблем передавать не шаблонные функции, векторы и тому подобное ... Проблема с шаблонными функциями.

2) Кроме того, даже если бы я мог передать функции шаблона в качестве аргументов функциям, которые обращаются к вспомогательным файлам, мои списки аргументов заканчиваются очень долго.

Я хотел бы знать, что, есть ли способ заставить вспомогательные файлы "видеть" класс?Я попытался передать INSTANCE класса в качестве аргумента / параметра в каждую функцию, которая выполняет вспомогательные операции.Но это приводит к тому, что «instanceName не объявлено в этой области», и это выглядит как довольно циклический / запутанный подход.

Любой совет будет очень признателен.Спасибо.

Ответы [ 2 ]

4 голосов
/ 15 октября 2011

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

Возможно, мне не хватает дополнительной информации о вашей конкретной ситуации, но независимо от того, какой сторонний код вы используете, вы должны иметь возможность делать что угодно с вашим написанным кодом, и это звучит так, как будто вы много писали.

Вы признали, что ваш класс слишком большой, поэтому следующий шаг - разбить его на отдельные, более сплоченные классы. Попытка создать другие файлы / функции, которые просто изменят внутреннее состояние вашего одного класса, который уже велик, сделает код еще больше, и вы добавите его еще больше, чем сейчас.

Если сторонняя библиотека должна работать с одним написанным вами классом, взгляните на шаблон проектирования Facade. Вы можете легко получить внешний вид сложного класса, но внутри он просто делегирует работу любому числу более специализированных классов.

Если вы хотите, чтобы один класс имел доступ к сторонней библиотеке, вы можете сделать это тоже. Взгляните на что-нибудь, например шаблон проектирования адаптера.

Еще один совет, который я могу предложить, - подобрать эту книгу по рефакторингу . Он покажет вам, как вы можете взять любой код, который выглядит слишком сложным, и методично применить шаги, чтобы сделать его намного более читабельным и обслуживаемым. Например, посмотрите на ваши элементы данных, выглядят ли какие-либо из них как принадлежащие к одной группе (то есть к ним часто обращаются / изменяют вместе)? Если да, подумайте о том, чтобы переместить их в их собственный класс, предоставляющий минимальный интерфейс для получения / настройки только того, что нужно вашему основному классу.

Этот пост не отвечает на ваш конкретный вопрос, но делает шаг назад, может быть, есть гораздо лучшее решение, чем нарушение правил ОО и хороших принципов проектирования, просто из-за некоторых ограничений, которых на самом деле не может быть.

0 голосов
/ 15 октября 2011

Вы, вероятно, можете создать вспомогательный класс шаблона вместо вспомогательных функций, передав ему указатель на ваш первый (большой) класс?

...