2015-03-30 3 views
0

Чтобы описать немного сложнее, я думаю. Но я делаю все возможное ...Какой класс должен использоваться C++?

Дано:

прог (Prog_A)

Lib (Lib_A) с класс Class_A

И Lib (Lib_B) с (также) класс Class_A и имеет элемент Class_A mClass_A

Оба класса Class_A имеют функцию

void Class_A::DoSome(){ 
... 
} 

Для Class_A в Lib_A затем

void Class_A::DoSome(){ 
std::cout << "LIB_A"; 
} 

Для Class_A в Lib_B затем

void Class_A::DoSome(){ 
std::cout << "LIB_B"; 
} 

Prog_A включает в себя Lib_A, Lib_A включает в себя Lib_B. Lib_A и Lib_B «подключены» по Callback. Если я теперь называю mClass_A.DoSome() в Lib_B тогда это печать

LIB_A

вместо моего ожидания 'LIB_B'.

Правильно ли это, или я должен беспокоиться?

+3

Подробнее о функциях 'virtual' member & [vtables] (http://en.wikipedia.org/wiki/Virtual_method_table) –

+0

Какие классы классов классов Class_A принадлежат? –

+1

Ли Linux действительно имеет отношение к вопросу? Сделайте имена различными или используйте пространства имен, чтобы сделать вещи более понятными для использования. – crashmstr

ответ

4

Ваш код является неправильным. Вы дважды определили Class_A, и определения не совпадают.

Это не разрешено.

[C++11: 3.2/3]: Каждая программа должна содержать ровно одно определение каждого не-инлайн функции или переменной, ODR используемый в этой программе; не требуется диагностика. Определение может отображаться явно в программе, оно может быть найдено в стандартной или определяемой пользователем библиотеке или (при необходимости) неявно определено (см. 12.1, 12.4 и 12.8). Встроенная функция должна быть определена в каждой единицы перевода, в которой она используется odr.

[C++11: 3.2/5]: Там может быть больше, чем одно определение типа класса (пункт 9), тип перечисления (7.2), встроенные функции с внешним связыванием (7.1.2), шаблон класса (пункт 14), не- шаблон статической функции (14.5.6), элемент статических данных шаблона класса (14.5.1.3), функция-член шаблона класса (14.5.1.1) или специализированная специализация шаблона, для которой некоторые параметры шаблона не указаны (14.7, 14.5. 5) в программе, при условии, что каждое определение отображается в другом блоке перевода, и при условии, что определения удовлетворяют следующим требованиям:. Учитывая такой объект с именем D` определены в более чем одной единице трансляции, то

  • каждое определение D состоит из одной и той же последовательности лексем;
  • [..]

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

Использование пространств имен для разделения определений друг от друга.

Мне удалось случайно вызвать эту проблему один раз при использовании a custom boost::lexical_cast specialisation I'd found on Stack Overflow в общей библиотеке, не понимая, что оригинальная специализация по умолчанию была создана в отдельной общей библиотеке. Поведение, которое я получил от основного приложения, было довольно непредсказуемым.

+0

Привет, спасибо всем! В основном я был не уверен, допустил ли я ошибку, и я «перенаправил» неизвестное, или это, в данном случае, нормальное поведение. Итак, все хорошо. Между тем я изменил одно имя класса, которое «то же самое», что и использование имени. Но хорошо знать на будущее. Спасибо вам большое! Приветствие Earlybite – Earlybite

Смежные вопросы