Разная версия класса с одним и тем же именем в разных файлах - PullRequest
1 голос
/ 06 октября 2011

У меня есть две версии одного и того же класса в двух разных файлах (A.cpp, Ah, B.cpp, Bh), во всех файлах класс имеет одно и то же имя, но отличается внутренней реализацией.

Моя идеяэто переключиться с одной версии на другую, просто изменив имя файла .h в #include, поэтому мне не нужно было ничего менять в коде (оба метода версии имеют одинаковую подпись и одинаковые свойства)

Ah и Bh никогда не включаются одновременно.

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

Можно ли это сделать?или это нарушает некоторые правила C ++?Я думаю, что это не должно нарушать Одно Правило Определения, потому что я не использую А и В одновременно.

Ответы [ 4 ]

2 голосов
/ 06 октября 2011

То, что я часто буду делать, это искажать версию в пространство имен и использовать это.Что-то вроде:

namespace Xyz_A {   //  In A.h
//  Define version A
}

namespace Xyz = Xyz_A;

B.h используйте взамен _B.

Таким образом, вы бы написали Xyz::... в своей программе, но внешние символы будут иметь искаженные Xyz_A или Xyz_B.Но в моем варианте это действительно больше защиты от ошибок.Я упорядочу вещи в моих make-файлах так, чтобы при переключении между A.h и B.h исполняемый файл также связывался с соответствующей библиотекой, а не с другой.

2 голосов
/ 06 октября 2011

Решение состоит в том, чтобы не связывать старый файл с конечным исполняемым файлом.Таким образом, будет доступна только новая реализация.

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

Вам нужно будет загрузить правильную библиотеку, соответствующую файлу заголовка.

Я бы посоветовал изучить шаблон проектирования прокси, чтобы вы могли включить оба класса: A и B. Затем вы можете использовать прокси, чтобы выбрать, какую функцию класса использовать во время выполнения.

http://en.wikipedia.org/wiki/Proxy_pattern

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

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

Лучшее решение, конечно, будет чем-то, что не зависит от системы сборки, но использует языковые средства для изменения кода во время компиляции, какшаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...