![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Esaul |
|
|||
|
Unregistered |
Вот решил перейти Visual C++ c CBuilder'a стал класс описывать, компилировал ..., вроде работало, а потом в дебагере получил:
ClassTMas error LNK2005: "public: __thiscall TMasV::TMasV(int)" (??0TMasV@@QAE@H@Z) already defined in ClassTMas.obj ClassTMas error LNK2005: "public: __thiscall TMasV::~TMasV(void)" (??1TMasV@@QAE@XZ) already defined in ClassTMas.obj ClassTMas error LNK2005: "public: void __thiscall TMasV::FillMasV(void)" (?FillMasV@TMasV@@QAEXXZ) already defined in ClassTMas.obj ClassTMas error LNK2005: "public: void __thiscall TMasV::PrintMasV(void)" (?PrintMasV@TMasV@@QAEXXZ) already defined in ClassTMas.obj ClassTMas fatal error LNK1169: one or more multiply defined symbols found Помогите пожалуйста. |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Код в студию
Посмотри по хелпу
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Esaul |
|
||||
|
Unregistered |
Help'a нету!
|
||||
|
|||||
| bilbobagginz |
|
||||||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
0. код который ты написал не обязаб работать так как в файле имеющем main() нет никакого отношения к классу TMasV. на среду разработки нельзя полагаться.
1. нет разделения на интерфейс-реализацию. нужен файл - интерфейс (заголовок) с объявлением класса и его методами, и другой с их реализациями. обычно делают так: а) файл-заголовок ( interface )
b) файл-реализация всех или части методов класса (implementation)
c) теперь используем класс MyClass в proc.cc:
2. у тебя ";" после определения ( а не объявления ) всех функций. это необязательно. 3. в главной программе у тебя написано:
ты скобочки забыл. удачи. Это сообщение отредактировал(а) bilbobagginz - 10.9.2005, 11:25 -------------------- Я ещё не демон. Я только учусь. |
||||||||
|
|||||||||
| Esaul |
|
|||
|
Unregistered |
bilbobagginz спасибо. Сделал как ты показал, правда выдал ошибку на пункте b:
ClassTMas fatal error C1010: unexpected end of file while looking for precompiled header directive затем в нем подключил "stdafx.h" и все заработало. А поподробней нельзя про:
|
|||
|
||||
| kometa_triatlon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Это защита от повторного включения заголовочного файла. То есть, если большой проект и много заголовочных файлов, может случится, что какой-то хидер-файл включили несколько раз. Тогда возникают ошибки типа class redefinition. С этими директивами такое не пройдет.
Способ, кажется, устаревший
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||
|
|||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
kometa_triatlon
Не способ устаревший, это просто Майкрософт опять своими нововведениями кормит. Им ведь не выгодно, чтобы код был портируемым |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
En_t_end
Во всяком случае, короче -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
Есаул. используй #ifdef, #define и #include
Есссно, при нужной ситуации. a на самом деле почитай про пре-процессор. ЗЫ кстати... откуда пошло это "хидер"... вроде "хедер" .. если с английского.[плиз без обид] -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Esaul |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 13.9.2005 Репутация: нет Всего: нет |
Вот опять ошибка
Project(Key) error C2512: 'ClassLock' : no appropriate default constructor available ClassLock.h:
ClassLock.cpp
ClassKey.h
Ошибка сдесь. ClassKey.cpp
|
||||||||
|
|||||||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
Могу и ошибится , но зачем 2 раза объявлять
в двух классах, тем более наследуемых? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Esaul
обшибка в том, что в конструкторе производного класса нужно явно вызывать конструктор базового, ибо no appropriate default constructor available (у базового класса нет конструктора по-умолчанию). Т.е. должно быть так:
Ну и Romikgy прав, разумеется. Это переопределение n, во-первых, очень нехорошее и может вызвать проблемы, во-вторых, нафиг никому не нужное. -------------------- ... |
|||
|
||||
| Esaul |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 13.9.2005 Репутация: нет Всего: нет |
Earnest
Спасибо за помощь. А я то думал, что он к конструктору по умолчанию прикапывается. Кстати если "n" повторно необъявить он выдаёт: Project(Key) error C2614: 'ClassKey' : illegal member initialization: 'n' is not a base or member С "n" вроде все работает. И маленький вопрос: Конструкторы не наследутся, а деструкторы наследуются? |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Конструкторы, как и деструкторы, не наследуются.
Конструктор базового класса просто вызывается до конструктора потомка, а деструктор базового после соответственно деструктора потомка. Если у базового класса нет конструктора по умолчанию, то в потомке надо принудительно в конструкторе "объявлять" используемый конструктор базового с его параметрами - именно он вызовется перед конструктором потомка. З.Ы. Последнее можно делать всегда, независимо от того, есть ли в базовом классе конструктор по умолчанию (не закрытый). |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А ты его просто убери из инициализации: так инициализировать можно только члены данного класса, но не предков. n инициализируется в конструкторе базового класса. Если не уберешь n из производного класса, у тебя будут 2 различных n, а это нехорошо. Добавлено @ 17:28
А ты его просто убери из инициализации: так инициализировать можно только члены данного класса, но не предков. n инициализируется в конструкторе базового класса. Если не уберешь n из производного класса, у тебя будут 2 различных n, а это нехорошо. -------------------- ... |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |