0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 7
1

Не работает программа из книги Дейтела "Как программировать на с++"

11.10.2011, 16:08. Показов 5946. Ответов 42
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, решить проблему. Программа из раздела книги "Отделение интерфейса от реализации". При компиляции(использую visual c++ 2008) возникают ошибки:

1) error LNK2019: unresolved external symbol "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall GradeBook::getCourseName(void)" (?getCourseName@GradeBook@@QAE?AV?$ basic_string@DU?$char_traits@D@std@ @V?$allocator@D@2@@std@@XZ) referenced in function _main
2)error LNK2019: unresolved external symbol "public: __thiscall GradeBook::GradeBook(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0GradeBook@@QAE@V?$basic_string@ DU?$char_traits@D@std@@V?$allocator @D@2@@std@@@Z) referenced in function _main

Текст программы следующий:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// файл GradeBook.h
// определение класса GradeBook
 
#include <string>
using std::string;
 
// Определение класса GradeBook
class GradeBook
{
public:
 
GradeBook(string); // конструктор инициализирующий courseName
void setCourseName(string); // устанавливает courseName
string getCourseName(); // получает название курса
void displayMessage(); // выводит сообщение приветствия
 
private: 
string courseName; // название курса для данного GradeBook
 
};
 
 
// файл gradebook.cpp
// Определение элемент-функций класса GradeBook
 
#include <iostream>
using namespace std; 
 
#include "GradeBook.h"
 
GradeBook::GradeBook(string name) // конструктор инициализирует courseName переданной строкой 
{
setCourseName(name);     // инициализировать вызовом set-функции
}
 
void GradeBook::setCourseName(string name)  // функция для установки названия курса
{
courseName = name;
}
 
string GradeBook::getCourseName() // функция для получения названия курса
{
return courseName;  
}
 
void GradeBook::displayMessage()    // вывести сообщение приветствие пользователю GradeBook
{
cout << "Wellcome to the grade book for\n" << getCourseName();
cout << "!" << endl;
}
 
 
// файл CourseC++.cpp
// Демонстрация класса GradeBook после отделения его интерфейса
// от реализации
 
#include <iostream>
using namespace std;
 
#include "GradeBook.h" // включить определение класса GradeBook
 
int main()
{
// создать два объекта GradeBook
GradeBook gradeBook1("CS101 Introduction to C++ Programming");
GradeBook gradeBook2("CS102 Data Structures in C++");
 
// вывести исходное значение сourseName для каждого GradeBook
cout << "gradeBook1 created for:" << gradeBook1.getCourseName() << endl;
cout << "gradeBook2 created for:" << gradeBook2.getCourseName() << endl;
 
 
cout << endl;
 
return 0;
}
 Комментарий модератора 
Нет смысла вручную раскрашивать комментарии в исходном коде - с подсветкой синтаксиса для С++ лучше справится код [cpp][/cpp]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2011, 16:08
Ответы с готовыми решениями:

Книги по С++ (что читать после книги Дейтела "Как программировать на С++")
Добрый день господа!!! Я от можно сказать дочитываю Дейтела &quot;Как программировать на С++&quot; 5...

Где найти примеры задач из книги Дейтела по C++
Скачал книгу Дейтела на C++ не могу найти примеры задач, мб есть у кого?

Задача из книги Дейтел Как программировать на C++
Друзья! Я начал не так давно заниматься программированием. Имелся опыт с паскалем,но решил...

Задача из книги Дейтелов Как программировать на C++
Задание: модифицируйте приложение, чтобы оно подтверждало действительность ввода.При любом вводе,...

42
Заблокирован
Автор FAQ
11.10.2011, 16:20 2
Harvy Dent, хоть убей не пойму в чём проблемма, всё компилится на ура, в программе ввёл единственную замену - зачем 2 раза подключать
Цитата Сообщение от Harvy Dent Посмотреть сообщение
#include <iostream>
using namespace std;
- это на мой взгляд глупость и выглядит как множественное подключение. Вот так пишем и компилируем
C++
1
2
3
4
5
6
// файл GradeBook.h
// определение класса GradeBook
#include <iostream>
using namespace std; 
#include <string>
using std::string;
C++
1
2
3
4
#include "GradeBook.h" // включить определение класса GradeBook
int main()
{
// создать два объекта GradeBook
Миниатюры
Не работает программа из книги Дейтела "Как программировать на с++"  
Вложения
Тип файла: rar GradeBook_proj.rar (2.3 Кб, 34 просмотров)
1
-=ЮрА=-
11.10.2011, 16:23
  #3

Не по теме:

PS:Возможно указанные в топике ошибки и были обусловлены многократным подключением #include <iostream>. В проекте прикрепил РАБОЧИЙ проект - консоль приложил как подтверждение...

0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
11.10.2011, 16:30 4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот так пишем и компилируем
C++
1
2
3
4
5
6
// файл GradeBook.h
// определение класса GradeBook
#include <iostream>
using namespace std; 
#include <string>
using std::string;
Ну молодец, что...
1
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 7
11.10.2011, 16:38  [ТС] 5
Большое спасибо =ЮрА= за помощь. Запустил твой проект и он на удивление заработал. А вот мой почему-то нет. Но это уже не так важно.
0
-=ЮрА=-
11.10.2011, 16:44
  #6

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Ну молодец, что...
- неужели я услышал что-то положительное в свою сторону?:D
Ну а если серьёзно чем на сей раз упрекнуть то меня хотел - что опять не так???:)

0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
11.10.2011, 16:48 7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ну а если серьёзно чем на сей раз упрекнуть то меня хотел - что опять не так?
Я жирным выделю, вместо тэгов.)

// файл GradeBook.h
// определение класса GradeBook
#include <iostream>
using namespace std;
#include <string>
using std::string;

Добавлено через 38 секунд

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Ну молодец, что...
Я излишне грамотный. Хотел написать "чо", но не смог.(

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 16:52 8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PS:Возможно указанные в топике ошибки и были обусловлены многократным подключением #include <iostream>
скандалы, интриги, расследования.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Harvy Dent, хоть убей не пойму в чём проблемма, всё компилится на ура, в программе ввёл единственную замену - зачем 2 раза подключать
#include <iostream>
using namespace std;
- это на мой взгляд глупость и выглядит как множественное подключение. Вот так пишем и компилируем
какая разница, как это выглядит? А вот запись "using namespace std;" в заголовочном файле - это просто-таки насилие над идеей пространств имен. Я бы, наверное, подал на тебя в суд, если бы это имело бы смысл
1
Заблокирован
Автор FAQ
11.10.2011, 17:06 9

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Я бы, наверное, подал на тебя в суд, если бы это имело бы смысл
- поясни нормально на пальцах, учту в дальнейшем...
В чём ошибка что буду юзать именно std?
По моему 10 без этой строки using namespace std; вообще посылает
PS:Я в виндозе пишу и юзаю студию(причём в данный момент 6-ую)



Добавлено через 7 минут
Nameless One, может всё-таки ответишь, а то как то обижаешь ни за что!Человеку я помог
Цитата Сообщение от Harvy Dent Посмотреть сообщение
Большое спасибо =ЮрА= за помощь. Запустил твой проект и он на удивление заработал. А вот мой почему-то нет. Но это уже не так важно.
.

Не по теме:

Что строками using namespace std; ?
#include <string> заменить, по моему без разницы когда мы сказали использовать std до или после string

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 17:11 10
-=ЮрА=-, потому, что если использовать директиву "using namespace std;" в заголовочном файле, то засоряется глобальное пространство имен не только в этом самом заголовочном файле, но и в каждом файле, в котором этот заголовочный файл включается.
Эту директиву вообще не рекомендуется использовать, но если сильно хочется, то лучше ограничить ее действие только .cpp-файлами
1
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 7
11.10.2011, 17:13  [ТС] 11
Глупый вопрос. Как ты создавал этот проект? Мне кажется, что программа не работала именно из-за неправильного создания проекта, так как в книге об этом Дейтел не говорит.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 17:17 12
Цитата Сообщение от Harvy Dent Посмотреть сообщение
Глупый вопрос. Как ты создавал этот проект? Мне кажется, что программа не работала именно из-за неправильного создания проекта, так как в книге об этом Дейтел не говорит.
это ты сейчас с кем разговариваешь? О_о
0
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 7
11.10.2011, 17:21  [ТС] 13
По поводу using namespace std;. Не буду спорить, плохо или хорошо включать эту строку(так как пока не разбираюсь в этом), но без неё в Visual c++ 2008 у меня почему-то даже "Hello world!" не запускался.
0
-=ЮрА=-
11.10.2011, 17:24
  #14

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
using namespace std;
убрать в хедере и только в CourseC.cpp вбить после этого #include "GradeBook.h", ок
Цитата Сообщение от Nameless One Посмотреть сообщение
но если сильно хочется,
- ха без неё компилятор посылает на 3 буквы при использовании std::cout(cin) - хорошо учту твоё замечание...

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 17:26 15
Harvy Dent, hint: идентификатор cout расположен в пространстве имен std. Поэтому, чтобы его использовать в программе, тебе нужно указать прострванство имен:
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
   std::cout << "Hello, World!" << std::endl;
   return 0;
}
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ха без неё компилятор посылает на 3 буквы при использовании std::cout
пример приведи, а то я все ее не использую, но компилятор почему-то меня никуда не посылает
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
убрать в хедере и только в CourseC.cpp вбить после этого #include "GradeBook.h", ок
это еще приемлимо, да, но нужно "вбивать" using namespace std; после подключения всех хедеров
0
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 7
11.10.2011, 17:29  [ТС] 16
-=ЮрА=-, как ты создавал этот проект? Мне кажется, что программа не работала именно из-за неправильного создания проекта, так как в книге об этом Дейтел не говорит.
0
Заблокирован
Автор FAQ
11.10.2011, 17:33 17
Цитата Сообщение от Harvy Dent Посмотреть сообщение
Не буду спорить, плохо или хорошо включать эту строку(так как пока не разбираюсь в этом), но без неё в Visual c++ 2008 у меня почему-то даже "Hello world!" не запускался.
- я уже об этом написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ха без неё компилятор посылает на 3 буквы при использовании std::cout(cin)
Предполагаю что Nameless One, не использует студию и там подключение данного неймспейса критично, студия наоборот требует явного указания на использование функций std

Добавлено через 2 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
пример приведи, а то я все ее не использую, но компилятор почему-то меня никуда не посылает
- вечером посыл от 2008 выложу, хотя на 6-ке компилится норм
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main(void)
{
    std::cout<<"Hello world";
    return 0;
}
Nameless One, какой компилятор ты используешь???
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 17:33 18
-=ЮрА=-, в студии тоже не обязательно использовать строку using namespace std;
Просто, все что ты берешь оттуда, нужно предварять квалификатором std::
Т.е., вместо cout писать std::cout и приведенный Nameless One пример компилируется в студии на ура
VS2010 - моя IDE
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 17:34 19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Предполагаю что Nameless One, не использует студию и там подключение данного неймспейса критично, студия наоборот требует явного указания на использование функций std
Добавлено через 25 секунд
Nameless One, какой компилятор ты используешь???
это критично везде и не зависит от используемого компилятора
и да, ошибки ТС, полученные в первом посте - это ошибки линковки, которые опять таки не связаны с пространством имен
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 17:37 20
Ну и в догонку, вот что на эту тему говорит Google Coding Style Guide
0
11.10.2011, 17:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2011, 17:37
Помогаю со студенческими работами здесь

Подскажите книги, как программировать для GPU ?
Подскажите книги, какие есть лучшие, как программировать для GPU ? Желательно начать с...

Как лучше читать книги и учиться программировать?
Начал читать Майкла Доусона и до 4й главы все было легко и программы писать получалось, но потом...

Непонятный пример из книги Дейтел Как программировать на C++
Вот сделал скриншот. Хотя я точно так пишу, но выскакивает ошибка при компиляции. А почему? error:...

Задача из книги Дейтела "Шахматная доска"
В задаче использовать управляющие структуры(лог.операции, циклы) можно массивы. Остального я пока...

Задача из книги Дейтела "Квадрат"
Здравствуйте,В задаче использовать управляющие структуры(лог.операции, циклы) можно массивы....

Задача из книги Дейтела "Ромб"
В задаче использовать управляющие структуры(лог.операции, циклы) можно массивы. Остального я пока...

Пример из книги "Как программировать на С++"
Доброго времени суток форумчане! Читал книгу и наткнулся на такой пример: #include &lt;iostream&gt;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru