Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2009, 21:16   #1
Palermo
Новичок
Джуниор
 
Регистрация: 02.06.2009
Сообщений: 4
Восклицание Проблема с компиляцией программ из нескольких исходных файлов

Доброго времени суток, начал читать книгу "Как программировать на С++" Дейтела и столкнулся с проблемой. В книге автор сразу знакомит читателя с ООП и сопутствующим ему разбиением на файлы, например, в моем случае, интерфейс класса содержится в файле GradeBook.h, объектный код класса в GradeBook.сpp, работа с объектами и их создание в файле main.cpp (код см. ниже). Делаю я всё как у него в примере, работаю в CodeGear Rad Studio 2007, при компиляции проекта линковщик выдает следующие ошибки:
1)
[ILINK32 Error] Error: Unresolved external 'GradeBook::GradeBook(std::basic_st ring<char, std::char_traits<char>, std::allocator<char> >)' referenced from C:\DOCUMENTS AND SETTINGS\ADMIN\¦L+++Lг TT+T\¦TLTT-\DEBUG\FILE1.OBJ
2)
[ILINK32 Error] Error: Unresolved external 'GradeBook::getCourseName()' referenced from C:\DOCUMENTS AND SETTINGS\ADMIN\¦L+++Lг TT+T\¦TLTT-\DEBUG\FILE1.OBJ

main.cpp
Код:
#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h"

int main()
{
  GradeBook gradeBook1("CS101 Introduction to C++ Programming");
  GradeBook gradeBook2("CS102 Data Structures in C++");

  cout << "gradeBook1 created for: " << gradeBook1.getCourseName();
  << "\ngradeBook2 created for: " << gradeBook2.getCourseName() << endl;
  return 0;
}
GradeBook.cpp

Код:
#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h"

GradeBook::GradeBook(string name)
{
   setCourseName();
}

void GradeBook::setCourseName(string name)
{
   courseName=name;
}

string GradeBook::getCourseName()
{
   return courseName;
}

void GradeBook::displayMessage()
{
   cout << "Welcome to the grade book for\n" << getCourseName() << "!" << endl;
}
Gradebook.h


Код:
#include <string>
using std::string;
class GradeBook
{
public:
  GradeBook(string);
  void setCourseName(string);
  string getCourseName();
  void displayMessage();
private:
  string courseName;
};

P.S можно сделать и без разбиения на файлы, но хочется сразу научиться правильно
Palermo вне форума Ответить с цитированием
Старый 02.06.2009, 21:24   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Код:
GradeBook::GradeBook(string name)
{
   setCourseName();
}
В конструкторе вы ничего не передаете в функцию setCourseName(), а она принимает переменную типа string. Вот так.
Код:
GradeBook::GradeBook(string name)
{
   setCourseName(name);
}
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 02.06.2009, 21:29   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

И еще
Код:
 cout << "gradeBook1 created for: " << gradeBook1.getCourseName();
 cout << "\ngradeBook2 created for: " << gradeBook2.getCourseName() << endl;
И в main.cpp подключайте "GradeBook.cpp"
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.06.2009, 21:35   #4
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

или точку с запятой уберите после gradeBook1.getCourseName() - так тоже можно
Код:
 cout << "gradeBook1 created for: " << gradeBook1.getCourseName()
 << "\ngradeBook2 created for: " << gradeBook2.getCourseName() << endl;
Sazary, почему? Я всегда в main подключаю файл .h
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 02.06.2009, 21:37   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ACE Valery
почему? Я всегда в main подключаю файл .h
Да вот самому интересно ) Мой MinGW ругался (undefined reference), пока не изменил расширение.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.06.2009, 21:42   #6
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

А... Понятно. Просто я пользуюсь Visual Studio, поэтому все ок
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 02.06.2009, 22:18   #7
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Sazary ты наверно пытаешься собрать все через один файл) у меня gcc, вот так нормально собирается:
g++ main.cpp GradeBook.cpp -o main

для каждого класса нужно сделать свой объектный файл
vvviperrr вне форума Ответить с цитированием
Старый 02.06.2009, 22:22   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

vvviperrr, я просто в Dev-C++ main открываю и компилю
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.06.2009, 22:23   #9
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Да вот самому интересно ) Мой MinGW ругался (undefined reference)
Makefile неправильно сконфигурирован.

Цитата:
я просто в Dev-C++ main открываю и компилю
Ну тогда проект создайте..
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....

Последний раз редактировалось ISergeyN; 02.06.2009 в 22:27. Причина: ....
ISergeyN вне форума Ответить с цитированием
Старый 02.06.2009, 22:26   #10
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Sazary ну значит тебе надо добавить GradeBook.cpp и GradeBook.h в твое дерево проекта, чтобы среда поняла, что из этих файлов надо получить объектный иначе компиль думает, что в GradeBook.h находятся просто описания, а линкер матерится, типо где функции
vvviperrr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с компиляцией С++ Il'9 Помощь студентам 7 12.02.2009 19:18
дано два файла. получить третий,содержащий поочередно строки исходных двух файлов. HyvAchoK Паскаль, Turbo Pascal, PascalABC.NET 1 18.12.2008 10:51
Оцените PGF-улучшенный форматизатор исходных текстов Pascal + Delphi программ. Sasvi Софт 5 18.10.2008 01:26
Проигрывание нескольких файлов <-=SG=-> Общие вопросы Delphi 3 11.10.2008 15:47
проблема с компиляцией @gent БД в Delphi 5 11.09.2007 10:09