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

Исправить ошибку undefined reference to (Дейтелы, классы) - C++

Восстановить пароль Регистрация
 
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
20.12.2015, 06:10     Исправить ошибку undefined reference to (Дейтелы, классы) #1
Читаю Детелов. Глава Введение в классы и объекты. Туплю. Пример не прямой копипаст, но корни оттуда.

MyGradeBook.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef MYGRADEBOOK_H_INCLUDED
#define MYGRADEBOOK_H_INCLUDED
 
#include <string>       
using  std::string; 
 
class GradeBook{
    public:
        void get_Course_Name();
        void set_Course_Name(string S);
 
    private:
        string name;
};
 
#endif // MYGRADEBOOK_H_INCLUDED
MyGradeBook.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "MyGradeBook.h"
#include <iostream>
 
using std::cout;
 
void GradeBook::set_Course_Name(string S){
    name = S;
}
 
void GradeBook::get_Course_Name(){
    cout << "Course name: " << name << "";
}
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "MyGradeBook.h"
#include <string>
 
using std::string;
 
int main(){
string S = "ariphmetic";
GradeBook book;
 
book.set_Course_Name(S);
book.get_Course_Name();
 
}

По моей логике должно было сработать. Что именно я упустил из виду?
PHP
1
ошибка: undefined reference to `GradeBook::set_Course_Name(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
ниже рисунки из книги, я сколько раз смотрю, так и не получается увидеть где не так.
Миниатюры
Исправить ошибку undefined reference to (Дейтелы, классы)   Исправить ошибку undefined reference to (Дейтелы, классы)   Исправить ошибку undefined reference to (Дейтелы, классы)  

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2015, 06:10     Исправить ошибку undefined reference to (Дейтелы, классы)
Посмотрите здесь:

C++ undefined reference...
C++ undefined reference
Классы (исправить ошибку) C++
undefined reference to C++
Выдает ошибку [Linker error] undefined reference to `WinMain@16' C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
20.12.2015, 07:18     Исправить ошибку undefined reference to (Дейтелы, классы) #2
MyGradeBook.cpp не вошел в сборку
Liss29
 Аватар для Liss29
20 / 9 / 2
Регистрация: 18.11.2012
Сообщений: 402
Завершенные тесты: 1
19.04.2016, 03:25     Исправить ошибку undefined reference to (Дейтелы, классы) #3
Тоже самое, правда, в главе 7 массивы. Почему-то не хочет компилироваться и всё тут, куча ошибок, если точнее 41 и 2 предупреждения.
Кликните здесь для просмотра всего текста
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
//Рис. 7.16: GradeBook4.h 
//Определение класса GradeBook, использующего массив для хранения оценок. Элемент-функции определяются в GradeBook.cpp
#include <string> //программа использует стандартный класс string 
 
//Определение класса GradeBook
class GradeBook
{
    public:
    //константа - число студентов сдавших экзамен
    const static int students = 10; //на эту строку грешит и ругается.
    
    //конструктор инициализирует название курса и массив оценок
    GradeBook(string, const int[]);
    
    void setCourseName(); //устанавливает название курса
    string getCourseName(); //извлекает название курса
    void displayMessage(); //вывести приветственное сообщение
    void processGrades(); //различные действия над оценками
    int getMinimum(); //найти минимальную оценку за конрольную
    int getMaximum(); //найти максимальную оценку за контрольную
    double getAverage(); //определить среднюю оценку за контрольную 
    void outputBarChart(); //вывести диаграмму распределения оценок
    void outputGrades(); //вывести содержимое массива оценок
    
    private:
    string courseName; //название курса для данного GradeBook
    int grades[student]; //массив оценок студентов
}; //конец класса GradeBook


Кликните здесь для просмотра всего текста
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//Рис. 7.17: GradeBook4.cpp 
//Определение элеметн-функций класса GradeBook, использующего массив для хранения оценок студентов
#include <iostream>
#include <iomanip>
#include "GradeBook4.h" //определение класса GradeBook
 
//конструктор инициализирует название курса и массив оценок
GradeBook::GradeBook(string name, const int gradesArray[])
{
    setCourseName(name); //инициализировать courseName
    
    //копировать оценки из gradeArray в элемент данных grades
    for(int grade = 0; grade < student; grade++)
        grades[grade] = gradesArray[grade];
}
 
//функция для установки названия курса
void GradeBook::setCourseName(string name)
{
    courseName = name; 
}
 
//функция для извлечения названия курса
string GradeBook::getCourseName()
{
    return courseName;
}
 
//вывести сообщение-приветствие пользователю GradeBook
void GradeBook::displayMessage()
{
    //этот оператор вызывает getCourseName, чтобы получить название курса, представленного данным GradeBook 
    cout << "Welcome to the grade book for\n" << setCourseName()
         << "!" << endl;
}
 
//произвести над данными различные операции
void GradeBook:: processGrades()
{
    //вывести массив оценок
    outputGrades();
    
    //вызвать функция getAverage для вычисления средней оценки
    cout << "\nClass average is " << setprecision(2) << fixed
         << getAverage() << endl;
         
    //вызвать функции getMinimum и getMaximum
    cout << "Lowest grade is " << getMinimum()
         << "\nHighest grade is " << getMaximum() << endl;
         
    //вызвать outputBarChart для печати диаграммы распределения
    outputBarChart();
}
 
//найти минимальную оценку
int GradeBook::getMinimum()
{
    int lowGrade = 100; //принять низшую оценку равной 100
    
    //цикл по массиву grades
    for(int grade = 0; grade < students; grade++)
    {
        //если текущая оценка меньше lowGrade, присвоить её lowGrade
        if(grades[grade] < lowGrade)
            lowGrade = grades[grade]; //новая низшая оценка 
    }
    return lowGrade; //возвратить низшую оценку 
}
 
//найти максимальную оценку
int GradeBook::getMaximum()
{
    int highGrade = 0; //принять высшую оценку равной 0
    
    //цикл по массиву grades
    for(int grade = 0; grade < students; grade++)
    {
        //если текущая оценка выше highGrade, присвоить её highGrade
        if(grades[grade] > highGrade)
            highGrade = grades[grade]; //новая высшая оценка 
    }
    return highGrade; //возвратить высшую оценку 
}
 
//определить среднюю оценку за экзамен
double GradeBook::getAverage()
{
    int total = 0; //инициализировать сумму
    
    //суммировать оценки в массиве
    for(int grade = 0; grade < students; grade++)
        total += grades[grade];
        
        //возвратить среднее для оценок
    return static_cast< double >(total) / students;
}
 
//вызвать столбцовую диаграмму, покзывающую распределение оценок
void GradeBook::outputBarChart()
{
    cout << "\nGrade distribution:" << endl;
    
    //хранить частоты для каждого из диапазонов по 10 оценок 
    const int frequencySize = 11;
    int frequency[frequencySize] = { 0 };
    
    //для каждой оценки увеличить соответствующую частоту
    for(int grade = 0; grade < students; grade++)
        frequency[grades[grade] / 10]++;
    
    //для каждой частоты вывести столбец диаграммы
    for(int count = 0; count < frequencySize; count++)
    {
        //вывести метки столбцов("0-9:", ..., "90-99:", "100:")
        if(count == 0)
            cout << "  0-9: ";
        else if(count == 100)
            cout << "  100: ";
        else
            cout << count * 10 << "-" << (count * 10) + 9 << ": ";
        
        //напечатать столбец звёздочек
        for(int stars = 0; stars < frequency[count]; stars++)
            cout << '*';
        
        cout << endl; //напечатать новую строку выводв
    }
}
 
//вывести содержимое массива оценок
void GradeBook::outputGrades()
{
    cout << "\nThe grades are:\n\n";
    
    //вывести оценку каждого студента
    for(int student = 0; student < students; student++)
        cout << "Student " << setw(2) << student + 1 << ": "
             << setw(3) << grades[student] << endl;
}


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Рис. 7.18: fig07_18.cpp
//Создаёт объект GradeBook, используя массив оценок
 
#include "GradeBook4.h" //определения класса GradeBook
using namespace std;
int main()
{
    //массив оценок студентов
    int gradesArray[GradeBook::students] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };
    
    GradeBook myGradeBook("CS101 Intproduction to C++ Progrmming", gradesArray);
    myGradeBook.displayMessage();
    myGradeBook.processGrades();
    return 0;
}


Вот список ошибок:
Кликните здесь для просмотра всего текста
fig07_18.cpp
d:\мои документы\project\gradebook4\gradebook4.h(10) : error C2258: illegal pure syntax, must be '= 0'
d:\мои документы\project\gradebook4\gradebook4.h(10) : error C2252: 'students' : pure specifier can only be specified for functions
d:\мои документы\project\gradebook4\gradebook4.h(13) : error C2629: unexpected 'class GradeBook ('
d:\мои документы\project\gradebook4\gradebook4.h(13) : error C2238: unexpected token(s) preceding ';'
d:\мои документы\project\gradebook4\gradebook4.h(16) : error C2146: syntax error : missing ';' before identifier 'getCourseName'
d:\мои документы\project\gradebook4\gradebook4.h(16) : error C2501: 'string' : missing storage-class or type specifiers
d:\мои документы\project\gradebook4\gradebook4.h(26) : error C2146: syntax error : missing ';' before identifier 'courseName'
d:\мои документы\project\gradebook4\gradebook4.h(26) : error C2501: 'string' : missing storage-class or type specifiers
d:\мои документы\project\gradebook4\gradebook4.h(26) : error C2501: 'courseName' : missing storage-class or type specifiers
d:\мои документы\project\gradebook4\gradebook4.h(27) : error C2065: 'students' : undeclared identifier
d:\мои документы\project\gradebook4\gradebook4.h(27) : error C2057: expected constant expression
d:\мои документы\project\gradebook4\gradebook4.h(27) : warning C4200: nonstandard extension used : zero-sized array in struct/union
d:\мои документы\project\gradebook4\fig07_18.cpp(9) : error C2039: 'students' : is not a member of 'GradeBook'
d:\мои документы\project\gradebook4\gradebook4.h(7) : see declaration of 'GradeBook'
d:\мои документы\project\gradebook4\fig07_18.cpp(9) : error C2057: expected constant expression
d:\мои документы\project\gradebook4\fig07_18.cpp(9) : error C2466: cannot allocate an array of constant size 0
d:\мои документы\project\gradebook4\fig07_18.cpp(11) : error C2661: 'GradeBook::GradeBook' : no overloaded function takes 2 parameters
GradeBook4.cpp
d:\мои документы\project\gradebook4\gradebook4.h(10) : error C2258: illegal pure syntax, must be '= 0'
d:\мои документы\project\gradebook4\gradebook4.h(10) : error C2252: 'students' : pure specifier can only be specified for functions
d:\мои документы\project\gradebook4\gradebook4.h(13) : error C2629: unexpected 'class GradeBook ('
d:\мои документы\project\gradebook4\gradebook4.h(13) : error C2238: unexpected token(s) preceding ';'
d:\мои документы\project\gradebook4\gradebook4.h(16) : error C2146: syntax error : missing ';' before identifier 'getCourseName'
d:\мои документы\project\gradebook4\gradebook4.h(16) : error C2501: 'string' : missing storage-class or type specifiers
d:\мои документы\project\gradebook4\gradebook4.h(26) : error C2146: syntax error : missing ';' before identifier 'courseName'
d:\мои документы\project\gradebook4\gradebook4.h(26) : error C2501: 'string' : missing storage-class or type specifiers
d:\мои документы\project\gradebook4\gradebook4.h(26) : error C2501: 'courseName' : missing storage-class or type specifiers
d:\мои документы\project\gradebook4\gradebook4.h(27) : error C2065: 'students' : undeclared identifier
d:\мои документы\project\gradebook4\gradebook4.h(27) : error C2057: expected constant expression
d:\мои документы\project\gradebook4\gradebook4.h(27) : warning C4200: nonstandard extension used : zero-sized array in struct/union
d:\мои документы\project\gradebook4\gradebook4.cpp(8) : error C2065: 'string' : undeclared identifier
d:\мои документы\project\gradebook4\gradebook4.cpp(8) : error C2146: syntax error : missing ')' before identifier 'name'
d:\мои документы\project\gradebook4\gradebook4.cpp(8) : error C2350: 'GradeBook::GradeBook::GradeBook' is not a static member
d:\мои документы\project\gradebook4\gradebook4.cpp(8) : error C2059: syntax error : ')'
d:\мои документы\project\gradebook4\gradebook4.cpp(9) : error C2143: syntax error : missing ';' before '{'
d:\мои документы\project\gradebook4\gradebook4.cpp(9) : error C2447: missing function header (old-style formal list?)
d:\мои документы\project\gradebook4\gradebook4.cpp(18) : error C2146: syntax error : missing ')' before identifier 'name'
d:\мои документы\project\gradebook4\gradebook4.cpp(18) : error C2182: 'setCourseName' : illegal use of type 'void'
d:\мои документы\project\gradebook4\gradebook4.cpp(18) : error C2350: 'GradeBook::setCourseName' is not a static member
d:\мои документы\project\gradebook4\gradebook4.cpp(18) : error C2059: syntax error : ')'
d:\мои документы\project\gradebook4\gradebook4.cpp(19) : error C2143: syntax error : missing ';' before '{'
d:\мои документы\project\gradebook4\gradebook4.cpp(19) : error C2447: missing function header (old-style formal list?)
d:\мои документы\project\gradebook4\gradebook4.cpp(24) : error C2143: syntax error : missing ';' before 'tag::id'
d:\мои документы\project\gradebook4\gradebook4.cpp(24) : error C2501: 'string' : missing storage-class or
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
19.04.2016, 07:59     Исправить ошибку undefined reference to (Дейтелы, классы) #4
Цитата Сообщение от Liss29 Посмотреть сообщение
Тоже самое,
здесь не тоже самое.
здесь - полнейшее не знание основ.

все упоминания string меняйте на std::string для начала.
Liss29
 Аватар для Liss29
20 / 9 / 2
Регистрация: 18.11.2012
Сообщений: 402
Завершенные тесты: 1
19.04.2016, 16:51     Исправить ошибку undefined reference to (Дейтелы, классы) #5
hoggy
Да вы что, я не пишу std:: вставляю using namespace std; и у меня всё прекрасно компилировалось и линковалось. Здесь возникла загвоздка с объявлением элемента данных const static int students = 10; я даже не знаю с какой стороны подойти к решению этой проблемы... Ещё на string ругается хотя библиотека подключена, страно это, ведь всё компилировалось до этого прекрасно.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
19.04.2016, 18:56     Исправить ошибку undefined reference to (Дейтелы, классы) #6
Цитата Сообщение от Liss29 Посмотреть сообщение
Да вы что, я не пишу std:: вставляю using namespace std; и у меня всё прекрасно компилировалось и линковалось.
у вас какая то странная реакция.
особенно, учитывая:

Цитата Сообщение от Liss29 Посмотреть сообщение
Ещё на string ругается хотя библиотека подключена, страно это, ведь всё компилировалось до этого прекрасно.
это и называется "не знание основ".

вам нужно понять принцип по которому
собирается многофайловый проект.


если вратце, каждый спп файл представляет собой
отдельную независимую единицу трансляции.

например, при трансляции файла trololoo.cpp компилятор ничего не знает,
и знать не хочет об main.cpp

при этом, на этапе обработке препроцессором,
все вхождения #include "file.h"
заменяются текстов указанных файлов.

рассмотрим для примера ваш GradeBook4.cpp

вот его кусочек:

C++
1
2
3
4
5
//Рис. 7.17: GradeBook4.cpp 
//Определение элеметн-функций класса GradeBook, использующего массив для хранения оценок студентов
#include <iostream>
#include <iomanip>
#include "GradeBook4.h" // <--- сюда вставится текст из этого файла
после обработки препроцессором
вместо #include "GradeBook4.h"
будет подставлен текст файла:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Рис. 7.17: GradeBook4.cpp 
//Определение элеметн-функций класса GradeBook, использующего массив для хранения оценок студентов
#include <iostream>
#include <iomanip>
//Рис. 7.16: GradeBook4.h 
//Определение класса GradeBook, использующего массив для хранения оценок. Элемент-функции определяются в GradeBook.cpp
#include <string> //программа использует стандартный класс string 
 
//Определение класса GradeBook
class GradeBook
{
    public:
    const static int students = 10;
    
    GradeBook(string, const int[]); //  <---- upppssss, что такое string??????
    
    void setCourseName();
    string getCourseName(); //  <---- upppssss, что такое string??????

как видите, при обработке единицы трансляции GradeBook4.cpp
оказалось, что нигде не фигурирует ни std::, ни using namespace std;

и поэтому, компилятор не понимает, что это за тип такой.

одного лишь этого достаточно,
для того, что бы ваш проект не скомпилировался.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2016, 22:08     Исправить ошибку undefined reference to (Дейтелы, классы)
Еще ссылки по теме:

Классы. Не могу исправить ошибку C++
Выдает ошибку( undefined symbol display() in module, как исправить? C++
Исправить ошибку "undefined reference" C++

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

Или воспользуйтесь поиском по форуму:
Liss29
 Аватар для Liss29
20 / 9 / 2
Регистрация: 18.11.2012
Сообщений: 402
Завершенные тесты: 1
19.04.2016, 22:08     Исправить ошибку undefined reference to (Дейтелы, классы) #7
Я разве где-то писал, что я профиссионал, сразу ясно было, что я только только начал его изучать, C++ имею ввиду, ну а теперь по поводу того что, вы, мне написали, согласен ,вы, правы, ошибок стало вдвое меньше, но те ктороые мне абсолютно не понятны т.е.
: error C2258: illegal pure syntax, must be '= 0'
: error C2252: 'students' : pure specifier can only be specified for functions
так никуда и не делись.

То есть в многофайловых проектах нужно под каждой подключённой библиотекой явно указывать область видимости, например под
C++
1
#include <iostream>
, если мне нужно вводить и выводить информацию нужно
C++
1
using std::cout; using std::cin; using std::endl;
я правильно понял?

Как всё же решить проблему с объявлением
C++
1
const static int students = 10;?


Yandex
Объявления
19.04.2016, 22:08     Исправить ошибку undefined reference to (Дейтелы, классы)
Ответ Создать тему
Опции темы

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