Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.67
LuciLumi
1 / 1 / 0
Регистрация: 02.09.2010
Сообщений: 3
#1

Отделение интерфейса от реализации класса: компиляция кода реализации - C++

02.09.2010, 01:44. Просмотров 3725. Ответов 5
Метки нет (Все метки)

Доброго времени суток,
У меня возникла проблема с отделением интерфейса от реализации класса. Допустим, у меня есть три файла:
1. заголовочный файл Class.h с прототипами функций;
2. файл реализации Class.cpp с определениями функций без функции main;
3. файл клиента Start.cpp, использующий класс Class
Я хочу скомпилировать объектный код реализации класс. Однако при запуске компиляции Class.cpp компилятор Dev-C++ выдает ошибку: "[Linker error] undefined reference to `WinMain@16'" (короче, ему для счастья функции main() не хватает).
Как же скомпилировать объектный код реализации класса? Дейтел о таких подставах не предупреждал
Сам по себе код в порядке: пока я не пытаюсь отделить интерфейс от реализации и работаю с двумя файлами вместо трех (заголовочным, в котором определены функции, и файлом клиента) проблем не возникает.
Заранее спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2010, 01:44     Отделение интерфейса от реализации класса: компиляция кода реализации
Посмотрите здесь:

код реализации класса вектор C++
Отделение интерфейса класса от реализации C++
Отделение интерфейса от реализации C++
Класс, отделение интерфейса от реализации C++
C++ IDE с автосозданием и измененим реализации класса
C++ Ошибки в реализации класса Vector3D
C++ Отделение интерфейса класса от его реализации
Отделение интерфейса от реализации C++
Детали реализации конструктора класса C++
Трудности в реализации класса C++
Идеи реализации класса Menu C++
C++ Какие механизмы обеспечивают разделение интерфейса и реализации?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5761 / 3410 / 255
Регистрация: 08.02.2010
Сообщений: 7,412
02.09.2010, 04:18     Отделение интерфейса от реализации класса: компиляция кода реализации #2
LuciLumi, а можно краем глаза взглянуть на Ваш код?
LuciLumi
1 / 1 / 0
Регистрация: 02.09.2010
Сообщений: 3
02.09.2010, 07:59  [ТС]     Отделение интерфейса от реализации класса: компиляция кода реализации #3
Nameless One, большое спасибо за ответ!
Мой "родной" код довольно громоздкий, не думаю, что стоит Вас им грузить. Вот пример кода, найденный мной в одной из старых тем этого форума. При компиляции Empty.cpp Dev-C++ выдает ту же ошибку. Все три файла лежат в одной папке, и всё вроде бы должно работать, ан нет...

Empty.h
C++
1
2
3
4
5
class Empty{
   int a;
public:
   void Method();
};
Empty.cpp
C++
1
2
3
4
#include "Empty.h"
void Empty::Method(){
   a = 5;
}
main.cpp
C++
1
2
3
4
5
#include "Empty.h"
int main(){
   Empty E;
   E.Method();
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5761 / 3410 / 255
Регистрация: 08.02.2010
Сообщений: 7,412
02.09.2010, 08:35     Отделение интерфейса от реализации класса: компиляция кода реализации #4
LuciLumi, это не решит проблему, но все же скажу на будущее вот что. Заголовочные файлы с описанием функций и классов нужно защищать от повторного включения вот так (на примере приведенных Вами файлов):
C++
1
2
3
4
5
6
7
8
9
#ifndef EMPTY_H
#define EMPTY_H
 
class Empty{
   int a;
public:
   void Method();
};
#endif
Почему и как это работает - я отвечал в этой теме (см. пост 7 и далее).
По поводу Вашей проблемы - я не знаком со средой Dev-C++, но догадываюсь, в чем может быть ошибка. Судя по тому, что компилятор не может найти ссылку на функцию WinMain@16 (это главная функция WinAPI-приложения, принимает параметров в общей сложности на 16 байт), Вы создаете не тот тип проекта, а именно, что-нибудь типа Win32 Application (приложение Win32). Вам же нужно создавать консольное приложение (console application), для которого как раз главной функцией будет не WinMain, а просто main
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
02.09.2010, 10:11     Отделение интерфейса от реализации класса: компиляция кода реализации #5
Цитата Сообщение от LuciLumi Посмотреть сообщение
Как же скомпилировать объектный код реализации класса?
В командной строке это можно так сделать:
Код
g++ -c -o Class.o Class.cpp
В IDE какие-нибудь настройки по этому поводу должны быть...
LuciLumi
1 / 1 / 0
Регистрация: 02.09.2010
Сообщений: 3
03.09.2010, 00:24  [ТС]     Отделение интерфейса от реализации класса: компиляция кода реализации #6
Nameless One, easybudda, огромное спасибо за помощь!
Проблема действительно оказалась в типе проекта. С одной стороны, ошибка совершенно дурацкая, с другой - мне даже в голову не приходило обратить внимание на тип, пока Вы не подсказали.

Отдельное спасибо Nameless One за предупреждение о защите заголовочных файлов от повторного включения. Мне как самоучке особенно важны такие замечания.
Yandex
Объявления
03.09.2010, 00:24     Отделение интерфейса от реализации класса: компиляция кода реализации
Ответ Создать тему
Опции темы

Текущее время: 12:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru