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

Problem - Undefined reference to - C++

Восстановить пароль Регистрация
 
nka389
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 5
28.02.2013, 03:58     Problem - Undefined reference to #1
Доброго времени суток и спасибо заранее за Вашу помощь.

В качестве хобби начал изучать C++. Прочитал немного материала на сайтах и одну книгу, получил общее представление о языке и теперь принялся за упражнения. Вроде неплохо получалось, но вот дошел до первого упражнения с классами и тут же сел в лужу.

Упражнение требует создать программу с классом Account (разделенным на header и source) который представляет собой банковский счет и включает в себя несколько функции позволяющих манипулировать балансом счета.

Итак, вот что у меня получилось. При попытке build and run, code::blocks выдает целый список ошибок со словами "undefined reference to". Насколько я понимаю, main.cpp видит declaration моих функций в Account.h, но не видет их definition в Account.cpp. Я не понимаю почему, ведь наличие #include Account.h в Account.cpp, а также префикс Account:: переж каждой функцией класса должны вместе донести до main.cpp полную суть класса и его функций. Разве нет? Тысячу раз сверил все с книжкой, перепечетал похожую программу из книжки (Дейтл и Дейтл) и все равно не получается!

Прошу помощи!

Сам код:

Class header - Account.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using namespace std;
 
class Account
{
public:
    Account(int);
    void accountCredit(int);
    void accountDebit(int);
    void setBalance(int);
    int getBalance();
 
private:
    int nBalance;
};
Class source - Account.cpp

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
#include <iostream>
#include "Account.h"
 
using namespace std;
 
Account::Account(int startBalance)
{
    setBalance (startBalance);
}
 
void Account::setBalance(int startBalance)
{
    if (startBalance >= 0)
        nBalance = startBalance;
 
    if (startBalance < 0)
    {
        cout << "Invalid starting balance entered. Initial balance set to 0." << endl;
        nBalance = 0;
    }
}
 
int Account::getBalance()
{
    return nBalance;
}
 
void Account::accountCredit(int credit)
{
    nBalance = nBalance + credit;
}
 
void Account::accountDebit(int debit)
{
    if (debit <= nBalance)
        nBalance = nBalance - debit;
 
    if (debit > nBalance)
        cout << "You do not have sufficient funds in the account." << endl;
}
Program - main.cpp

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
#include <iostream>
#include "Account.h"
 
using namespace std;
 
int main()
{
    Account bankAccount1(1000);
    Account bankAccount2(2000);
 
    cout << "bankAccount1's initial balance is:" << bankAccount1.getBalance() << endl;
    cout << "bankAccount2's initial balance is:" << bankAccount2.getBalance() << endl;
 
    bankAccount1.setBalance(1100);
    bankAccount2.setBalance(2200);
 
    cout << "The new balance for bankAccount1 is:" << bankAccount1.getBalance() << endl;
    cout << "The new balance for bankAccount2 is:" << bankAccount2.getBalance() << endl;
 
    bankAccount1.accountCredit(5000);
    bankAccount2.accountCredit(10000);
 
    cout << "The new balance for bankAccount1 is:" << bankAccount1.getBalance() << endl;
    cout << "The new balance for bankAccount2 is:" << bankAccount2.getBalance() << endl;
 
    bankAccount1.accountDebit(6200);
    bankAccount2.accountDebit(12000);
 
    cout << "The new balance for bankAccount1 is:" << bankAccount1.getBalance() << endl;
    cout << "The new balance for bankAccount2 is:" << bankAccount2.getBalance() << endl;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2013, 03:58     Problem - Undefined reference to
Посмотрите здесь:

C++ undefined reference...
C++ undefined reference
C++ undefined reference
C++ undefined reference to `A::a'
undefined reference to C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.02.2013, 04:39     Problem - Undefined reference to #2
Class source - Account.cpp
#include <iostream>
#include "Account.h"

using namespace std;
зачем второй раз писать using namespace std ?
Цитата Сообщение от nka389 Посмотреть сообщение
Насколько я понимаю, main.cpp видит declaration моих функций в Account.h, но не видет их definition в Account.cpp.
Оба срр файла подключены к проекту???
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 05:39     Problem - Undefined reference to #3
Проект на Code::Bloсks первый? Как проект создавали? Как файлы в проект добавляли? В Code::Bloсks, добавление файлов в проект, сделано как-то, на мой вкус, не очень удобно, и не очень понятно.
nka389
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 5
28.02.2013, 14:56  [ТС]     Problem - Undefined reference to #4
Спасибо, что откликнулись.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
зачем второй раз писать using namespace std ?
Сделал все по книжке, однако вижу смысл вашего комментария. Строчка "using namespace std;" передается из "#include "Account.h". Верно?

Насчет проекта в code::blocks - проекта нет, я просто создал три файла в отдельной папке. В книге ничего про "проекты" не сказано и если честно я понимаю их суть. Сначала мне показалось, что это всего лишь для удобства сделано, но пока мои программы достаточно простые я и сам способен сохранить их в одну папку. Однако, что то мне подсказывает что это не так. Можете пожалуйста дать ссылку на тему которая объясняет для чего создавать отдельный "проект" для много-файловых программ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 19:17     Problem - Undefined reference to #5
Цитата Сообщение от nka389 Посмотреть сообщение
Можете пожалуйста дать ссылку на тему которая объясняет для чего создавать отдельный "проект" для много-файловых программ?
Насчёт ссылки на тему затрудняюсь. Лучше опишу, как в Code::Blocks проект создать и добавить туда файлы.
File - New - Project. Для вашего кода выбираете Empty project - Go. Next. Пишите имя вашего проекта(любое). Тут же можно выбрать папку, где проект будет создан. Next - Finish. В окне Code::Blocks (слева) появится название вашего проекта. Теперь нужно добавить в проект ваши фалы. Если эти файлы где-нибудь существуют, то самое простое, скопировать их в папку проекта. Потом правой кнопкой по имени проекта. Add files. Откроется папка проекта с файлами. Выделить их и нажать Открыть. После этого файлы появятся в проекте (в разделе Sources - .cpp, в разделе Headers - .h). После этого проект можно собирать.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
28.02.2013, 19:24     Problem - Undefined reference to #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
зачем второй раз писать using namespace std ?
Ну, коль уже пошла такая пьянка, то зачем вообще в заголовочном файле писать using namespace std??? Пользователь, подключая файл, осведомлен ли о том, что теперь работает с пространством std без префикса? ерунда какая-то. Если в какой-то области видимости используется стандартная библиотека - using нужно задавать для неё. А в заголовочных файлах не использовать его вообще или же использовать более урезанные версии, декларируя использование его-то конкретного из std, опять же, в ограниченной области видимости. Ну, немножко от темы отошел, но, думаю, никому не навредит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 19:29     Problem - Undefined reference to #7
Если файла не существует, то File - New - File. Выбираете тип файла, который хотите создать. Потом Go - Next. Выбираете C++. Next. Тут открываете обзор(откроется папка проекта), пишите имя файла, Сохранить(в папке проекта будет создан файл). All (файл будет создан для Release и Debug) - Finish. После этого пустой файл откроется в окне проекта. Можно писать туда текст. Всё описанное, наверное, можно сделать и другими способами, но я Code::Blocks редко пользуюся, поэтому мне этого хватает.
nka389
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 5
28.02.2013, 19:39  [ТС]     Problem - Undefined reference to #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Лучше опишу, как в Code::Blocks проект создать и добавить туда файлы.
Спасибо! Вечером попробую.


Цитата Сообщение от ITcrusader Посмотреть сообщение
Если в какой-то области видимости используется стандартная библиотека - using нужно задавать для неё.
Не до конца понял мысль. Тоесть вы считаете, что лучше в main.cpp и class.сpp (и в каждом последующем .cpp) писать отдельную строчку "using namespace std;"? А во всех header.h ее выпускать?
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
28.02.2013, 20:01     Problem - Undefined reference to #9
Цитата Сообщение от nka389 Посмотреть сообщение
Не до конца понял мысль. Тоесть вы считаете, что лучше в main.cpp и class.сpp (и в каждом последующем .cpp) писать отдельную строчку "using namespace std;"? А во всех header.h ее выпускать?
Считаете - неподходящее слово) Это так) В заголовочных файлах такой строки быть не должно! Подключая такой файл, ты обязываешь все файлы, в которые он прямо/косвенно инклудится, использовать идентификаторы из std. Да ладно его, std, с твоими пространствами то же самое будет. А каков итог? В куче файлов по вине одного заголовочного будет нарушен тот механизм, который в себе несет сама идея использования пространств имен.

В довесок. Будь программист скор на расправу, он засунул бы вообще using в stdafx.h - и все) Тогда смысл namespace полностью теряется и в будущем возникнут конфликты.
nka389
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 5
28.02.2013, 20:18  [ТС]     Problem - Undefined reference to #10
Цитата Сообщение от ITcrusader Посмотреть сообщение
Считаете - неподходящее слово) Это так) В заголовочных файлах такой строки быть не должно!
Спасибо, теперь все понятно. Проверил еще раз книжку - Дейтл & Дейтл - и там все таки так и учат, что надо вставлять "using namespace std;" в все файлы. Странно.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.02.2013, 21:20     Problem - Undefined reference to #11
Цитата Сообщение от ITcrusader Посмотреть сообщение
Сообщение от Kuzia domovenok
зачем второй раз писать using namespace std ?
Ну, коль уже пошла такая пьянка, то зачем вообще в заголовочном файле писать using namespace std???
Я пытался намекнуть потоньше в том числе на это.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 03:06     Problem - Undefined reference to
Еще ссылки по теме:

C++ Problem with passing a list variable by a reference
Undefined reference to C++
C++ Undefined reference to

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

Или воспользуйтесь поиском по форуму:
nka389
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 5
10.03.2013, 03:06  [ТС]     Problem - Undefined reference to #12
Извиняюсь за запоздалый ответ. Вопрос разрешен путем создания отдельного проекта в code::blocks.

Спасибо всем кто откликнулся!
Yandex
Объявления
10.03.2013, 03:06     Problem - Undefined reference to
Ответ Создать тему
Опции темы

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