Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как скрыть базовый класс  (Прочитано 19503 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 05-09-2005 09:33 » 

Может быть вопрос немного ламерский  Ангел
Есть у меня класс у него есть базовый класс который тоже написал я. Базовый класс у меня вынесен из проекта. Когда я наследую от базового класса я указываю h файл базового класса в include но при компиляции линкер выдает unresolved external на методы базового класса. Чтобы этой ошибки не было приходится включать базовый класс в проект.
Вопрос как унаследовать от базового класса не включая его в проект?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Alf
Гость
« Ответ #1 : 05-09-2005 09:53 » 

1. Что значит "Базовый класс у меня вынесен из проекта"? Он вынесен в DLL, находится в объектной библиотеке, ...?

2. Фраза " при компиляции линкер выдает unresolved external" также звучит загадочно. Я так понял, сама компиляция проходит нормально, ошибка появляется только про компоновке? Или не так?
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 05-09-2005 10:02 » new

1. Что значит "Базовый класс у меня вынесен из проекта"? Он вынесен в DLL, находится в объектной библиотеке, ...?
Здесь файлы BaseClass.h и BaseClass.cpp не являются частью проекта, не подключены к нему
2. Фраза " при компиляции линкер выдает unresolved external" также звучит загадочно. Я так понял, сама компиляция проходит нормально, ошибка появляется только про компоновке? Или не так?
Компиляция проходит нормально, ошибка возникает при компоновке
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 05-09-2005 10:11 » 

USBLexus
1. При выключении файла из проекта он не компилируется, отсюда и проблема с unresolved external, что означает, отсутствие тела функции при известном прототипе.
Для этого необходимо включать файл с телом ф-ии в проект.

2. При желании вынести файл cpp из проекта, необходимо собирать его в библиотеку или в DLL и подключать откомпилированный код в проект явно или неявно.

Какая цель преследуется???
Записан

А птичку нашу прошу не обижать!!!
Alf
Гость
« Ответ #4 : 05-09-2005 10:16 » 

Если просто выкинуть тело класса из проекта, компоновщик не сможет разрешить ссылки на него, само собой.

Можно поместить этот класс в статическую библиотеку, а потом указать ее в списке для компоновки.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 05-09-2005 10:17 » 

USBLexus , ну дык - не подключены - ты подключи их в дерево проекта - добавь в папки проекта через визард, а не только скопировав в папку проекта

и всё пролезет Улыбаюсь
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 05-09-2005 10:25 » 

USBLexus
1. При выключении файла из проекта он не компилируется, отсюда и проблема с unresolved external, что означает, отсутствие тела функции при известном прототипе.
Для этого необходимо включать файл с телом ф-ии в проект.

2. При желании вынести файл cpp из проекта, необходимо собирать его в библиотеку или в DLL и подключать откомпилированный код в проект явно или неявно.

Какая цель преследуется???
Цель преследуется - избежать нагромождение классов с Class Wizardе. Вынести класс в DLL хм... геморойно... А как это делается Где можно почитать? А если  я вынесу откомпиленый класс в DLL я смогу от него наследовать например в Дельфи  или Билдере?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 05-09-2005 10:26 » 

А можно как-нибудь откомпилировать отдельно класс как obj и подключить его?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 05-09-2005 10:29 » 

USBLexus , ну дык - не подключены - ты подключи их в дерево проекта - добавь в папки проекта через визард, а не только скопировав в папку проекта

и всё пролезет Улыбаюсь
Дык в том то и проблемма чтобы заставить работать базовый класс не подключая его к дереву...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 05-09-2005 10:40 » 

USBLexus а зачем?
Записан

Alf
Гость
« Ответ #10 : 05-09-2005 10:53 » 

Пардон, нормально цитировать не получается. Я сегодня на компе с Mozill'ой, цитирование почему-то не работает.

"А если  я вынесу откомпиленый класс в DLL я смогу от него наследовать например в Дельфи  или Билдере?"

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

Даже просто использовать класс из одной среды в другой напрямую не удастся ввиду name mangling, а это штука платформенно-зависимая. Можно, конечно, объявить класс как extern "C", но в этом случае будут проблемы с перегруженными методами (ради которых name mangling и вводился).
« Последнее редактирование: 20-12-2007 20:44 от Алексей1153++ » Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 05-09-2005 11:29 » 

Если .NET не подходит, то можно воспользоваться COM, так как в COM унифицированы операции вызова методов и передачи данных.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Alf
Гость
« Ответ #12 : 05-09-2005 11:37 » 

А разве наследование в COM поддерживается? Насколько я понял, USBLexus хочет не просто использовать внешний по отношению к проекту класс, а именно наследовать от него.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #13 : 05-09-2005 11:38 » 

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

Т.е. это ИМХО и даже не ИМХО две разные проблемы
1. Как на С++ под виндой и студией написать ДЛЛ для подключения в Дельфи и Билдере. Это одна проблема.
2. Как избавится от уже готовых и отлаженых модулей из списка в билдере - это вторая проблема.

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

первая проблема имеет несколько различных решений в зависимости от задачи.
Первое решение было найдено в моей теме как подключать билиотеку без знания имен функций или типов указателей на класс.
Объявлено простое решение создавать одну экспортную функцию как extern "C"  в которой переприсваивать указатели на нужные функции с помощью структуры поинтеров.
Записан

А птичку нашу прошу не обижать!!!
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 05-09-2005 11:55 » 

А разве наследование в COM поддерживается? Насколько я понял, USBLexus хочет не просто использовать внешний по отношению к проекту класс, а именно наследовать от него.

Не поддерживается, совершенно верно.  Именно по этой причине в Майкрософт пошли на разработку .NET.  Но до разработки .NET COM был единственным надёжным способом переиспользования объектно-ориентированного кода в разных средах.

С .NET, кстати, тоже не всё так гладко, как принято говорить.  Для достижения межязковой совместимости требуется, чтобы код соответствовал ряду требований, которые кратко именуются CLS Compliance.

Если надо настоящее Си++ наследование в Visual Studio и Builder, то наиболее предпочтительным мне кажется вынести все базовые классы в библиотеку и сделать две сборки библиотеки -- одну для Visual Studio, другую для Builder.  ИМХО, немного усложняется сборка и поддержка, но зато не надо лепить компиляторо-зависимые корявости.
« Последнее редактирование: 05-09-2005 11:59 от npak » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #15 : 06-09-2005 02:05 » 

штошшшшшшш... Значит буду копать в сторону DLL
Жалко конечно что не получится перенести классы на Билдер и Дельфи, было бы круто)
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #16 : 06-09-2005 03:03 » 

Только что совершенно случайно обнаружил такую весчь))) что если методы базового класса перенести в h а сам класс сделать шаблонным  а cpp файл удалить то все отлично подключается и компилируется без добавления в дерево Правда насколько это удобнее DLL надо еще подумать...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алик
Постоялец

kz
Offline Offline

« Ответ #17 : 08-09-2005 10:42 » 

"Цель преследуется - избежать нагромождение классов с Class Wizardе"
Для решения проблемы отображения лишних классов в class view (в .NET это, вроде, так называется)
нужно объявить класс (или группу классов) в своем пространстве имен. Потом можно смело подключать исходники библиотеки (и .h, и .cpp) в проект - все ее объявления буду в подузле с названием этого пространства имен. а если в самом конце хедера библиотеки написать "using namespace <имя_пространства_имен>, то использование пространства имен будет совершенно прозрачно для пользователей библиотеки.
Записан
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #18 : 08-09-2005 12:09 » 

>USBLexus
Только что совершенно случайно обнаружил такую весчь))) что если методы базового класса перенести в h а сам класс сделать шаблонным  а cpp файл удалить то все отлично подключается и компилируется без добавления в дерево Правда насколько это удобнее DLL надо еще подумать...

Абсолютно верно. Если делать полностью ин-лайн методы - то все прокатывает. Если тебя печалит писать в  хидер определения методов, то создавай файл *.inl и определяй методы в нем. Тогда после тебе потребуется только написать #inlcude "*.inl" там где эти методы нужны.
Записан

Сила ночи, сила дня - одинакого фигня....
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #19 : 08-09-2005 12:10 » 

Но на полностью inline -овых классах ты вряд ли напишешь серьезные вещи (допустим рекурсия в ин-лайн вообще невозможна). Смотри в общем по задаче. Если ин-лайн компоновка тебя не слишком устроит - то длл конечно же решение более оптимальное.
Записан

Сила ночи, сила дня - одинакого фигня....
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #20 : 09-09-2005 01:54 » 

Алик. Хм. интересно Стоит попробовать!)
ChaoticCube Честно говоря не хотелось бы связываться с inline классами)
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines