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

неопределенная ссылка - C++

Восстановить пароль Регистрация
 
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
09.10.2013, 16:47     неопределенная ссылка #1
Некомпилируется проект. Не могу понять где ошибка.

prata-10-2-head.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef PRATA-10-2-HEAD_H_INCLUDED
#define PRATA-10-2-HEAD_H_INCLUDED
#include <string>
class Person
{
private:
    static const int LIMIT = 25;
    std::string lname;
    char fname[LIMIT];
public:
    Person() {lname = ""; fname[0]='\0';}
    Person(const std::string & ln, const char * fn = "Heyyou");
    ~Person(){};
    void Show() const;
    void FormalShow() const;
};
 
 
 
#endif // PRATA-10-2-HEAD_H_INCLUDED


Prata-10-2.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
#include "prata-10-2-head.h"
#include <iostream>
#include <string>
#include <cstring>
extern LIMIT;
 
Person::Person(const std::string & ln, const char * fn = "Heyyou")
{
    lname=ln;
    strcpy(fname, *fn);
}
 
Person::~Person(){}
 
void Person::Show() const
{
    std::cout << "\n" << fname << " " << lname;
}
 
void Person::FormalShow() const
{
    std::cout << "\n" << lname << ", " << fname;
}


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
#include <iostream>
#include "prata-10-2-head.h"
using std::endl;
 
int main()
{
    Person one;
    Person two("Smythecraft");
    Person three("Alex", "Pirce");
 
    one.Show();
    std::cout<<endl;
    one.FormalShow();
    std::cout<<endl;
 
    two.Show();
    std::cout<<endl;
    two.FormalShow();
    std::cout<<endl;
 
    three.Show();
    std::cout<<endl;
    three.FormalShow();
    std::cout<<endl;
 
    return 0;
}


error:
Кликните здесь для просмотра всего текста

F:\lessons\Prata\CodeBlocks\Prata-10-2\prata-10-2-head.h|1|warning: extra tokens at end of #ifndef directive [enabled by default]|
F:\lessons\Prata\CodeBlocks\Prata-10-2\prata-10-2-head.h|2|warning: ISO C99 requires whitespace after the macro name [enabled by default]|
obj\Debug\main.o||In function `main':|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|8|undefined reference to `Person::Person(std::string const&, char const*)'|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|9|undefined reference to `Person::Person(std::string const&, char const*)'|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|11|undefined reference to `Person::Show() const'|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|13|undefined reference to `Person::FormalShow() const'|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|16|undefined reference to `Person::Show() const'|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|18|undefined reference to `Person::FormalShow() const'|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|21|undefined reference to `Person::Show() const'|
F:\lessons\Prata\CodeBlocks\Prata-10-2\main.cpp|23|undefined reference to `Person::FormalShow() const'|
||=== Build finished: 8 errors, 2 warnings (0 minutes, 1 seconds) ===|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2013, 16:47     неопределенная ссылка
Посмотрите здесь:

C++ Указатель и ссылка
Ссылка на файл C++
C++ Не найдена ссылка
Ссылка и Разыменование в с++ C++
C++ Указатель и ссылка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
09.10.2013, 16:55     неопределенная ссылка #2
Дефис - недопустимый символ для имени макроса. Исправьте это, дальше видно будет.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
09.10.2013, 16:58  [ТС]     неопределенная ссылка #3
Fyret, Картина не поменялась.

Добавлено через 1 минуту
Или в имени файла тоже дефисы нельзя?
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
09.10.2013, 17:17     неопределенная ссылка #4
Цитата Сообщение от h_wolf Посмотреть сообщение
Или в имени файла тоже дефисы нельзя?
Не знаю про такое ограничение, так что скорее всего можно.

Спрошу на всякий случай: Prata-10-2.cpp компилируется? полученный объектный файл линкуется?
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
09.10.2013, 17:19  [ТС]     неопределенная ссылка #5
Fyret, Как в Code::Blocks проверить линкуется ли? Влогах я ошибок в нем не видел. собственно весь лог в спойлере error.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
09.10.2013, 17:33     неопределенная ссылка #6
Про Code::Blocks не знаю. Но если файл - часть проекта, должен компилироваться и линковаться.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
10.10.2013, 09:23  [ТС]     неопределенная ссылка #7
Все три файла относятся к одно проекту, лежат в одной директории.

Добавлено через 15 часов 48 минут
Никто не знает в чем проблема?? ((
tzeentch
 Аватар для tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
10.10.2013, 09:48     неопределенная ссылка #8
Рабочий проект в аттаче.
Все работает, но код пришлось немного пофиксить, так что скорее всего файлы были некорректно добавлены в проект.
Вложения
Тип файла: zip test.zip (1.7 Кб, 4 просмотров)
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
10.10.2013, 10:11  [ТС]     неопределенная ссылка #9
tzeentch, это конечно очень здорово, но не могли бы Вы поведать где был баг?

Добавлено через 1 минуту
Я честно говоря не вижу ни одного измененного символа в коде. Где была ошибка?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
10.10.2013, 10:16     неопределенная ссылка #10
То что я нашел:
1) Вы два раза определяете тело деструктора.
2) fn это указатель
C++
1
    strcpy(fname, *fn);
Ну и так по мелочи...
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
10.10.2013, 10:18  [ТС]     неопределенная ссылка #11
Ilot, Ок, а остальные ошибки?
tzeentch
 Аватар для tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
10.10.2013, 10:24     неопределенная ссылка #12
Цитата Сообщение от h_wolf Посмотреть сообщение
где был баг?
Вы не добавили СРР файл в проект, и он не компилировался => ошибка undefined reference, которая возникает когда вызывается обьявленная, но не определенная функция.

Я добавил его в проект и исправил несколько мелких синтаксических ошибок, часть из них описал Ilot, все сейчас не помню.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
10.10.2013, 10:39     неопределенная ссылка #13
Цитата Сообщение от h_wolf Посмотреть сообщение
Ilot, Ок, а остальные ошибки?
ХЗ Исправлял по ходу дела. Например мой компилятор не одобряет определение статической константы в классе пришлось делать через перечисления.
Исправил дерективы:
C++
1
2
#ifndef PRATA102HEAD_H
#define PRATA102HEAD_H
Впринципе смотрите на что у вас компилятор ругается. Он мужЫк умный его надо слушать.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
10.10.2013, 11:00  [ТС]     неопределенная ссылка #14
Цитата Сообщение от Ilot Посмотреть сообщение
Он мужЫк умный его надо слушать.
Таки я его и слушаю )

tzeentch, все три файло были в проекте! )) В том то и дело. Может быть сбой линковщика или IDE?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2013, 11:03     неопределенная ссылка #15
Цитата Сообщение от h_wolf Посмотреть сообщение
а остальные ошибки?
errors:

1)
C++
1
2
3
extern LIMIT;
     
extern const int LIMIT;
2)
C++
1
2
3
4
5
6
7
8
9
Person::Person(const std::string & ln, const char * fn = "Heyyou")
{
       ...
}
    
Person::Person(const std::string & ln, const char * fn )
{
       ...
}
3)
C++
1
2
3
strcpy(fname, *fn);
    
strcpy(fname, fn);
4)
C++
1
2
3
~Person() {}
     
 ~Person();
warnings:

C++
1
2
3
4
5
#ifndef PRATA-10-2-HEAD_H_INCLUDED
#define PRATA-10-2-HEAD_H_INCLUDED
 
#ifndef PRATA_10_2_HEAD_H_INCLUDED
#define PRATA_10_2_HEAD_H_INCLUDED
tzeentch
 Аватар для tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
10.10.2013, 11:08     неопределенная ссылка #16
Цитата Сообщение от h_wolf Посмотреть сообщение
tzeentch, все три файло были в проекте! )) В том то и дело. Может быть сбой линковщика или IDE?
Я не видел ваш проект. Я скопипастил код, который вы предоставили, и заставил его работать.

Сбой линковщика - простите, что?? Он ясно вам говорит судя по еррорлогу - отсутсвует определение класса Person.

Вот сбой IDE возможен, точнее, неверное понимание работы с ней. Если бы вы выложили проект целиком, то можно было бы понять, в чем там ошибка... телепатией я, к сожалению, не владею.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
10.10.2013, 12:27  [ТС]     неопределенная ссылка #17
tzeentch, link

Цитата Сообщение от alsav22 Посмотреть сообщение
Код C++
1
2
3
4
5
6
7
8
9
10
Person::Person(const std::string & ln, const char * fn = "Heyyou")
{
* * * *...
}
Person::Person(const std::string & ln, const char * fn )
{
* * * *...
}
А как тогда определить аргумент по умолчанию?
tzeentch
 Аватар для tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
10.10.2013, 12:30     неопределенная ссылка #18
Цитата Сообщение от h_wolf Посмотреть сообщение
А как тогда определить аргумент по умолчанию?
Только в прототипе в h-файле, в cpp не надо.

Пример:
C++
1
2
3
4
5
6
7
struct Foo {
  void foo( int a = 0 );
};
 
void Foo::foo(int a) {
  //...
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2013, 12:31     неопределенная ссылка
Еще ссылки по теме:

C++ Неопределенная ссылка на `WinMain @ 16 '
C++ Ссылка на указатель
C++ Неопределенная ссылка при многофайловой реализации шаблона

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

Или воспользуйтесь поиском по форуму:
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
10.10.2013, 12:31  [ТС]     неопределенная ссылка #19
Цитата Сообщение от tzeentch Посмотреть сообщение
Только в прототипе в h-файле, в cpp не надо.
Понял, спасибо. Как-то не подумал об этом.
Yandex
Объявления
10.10.2013, 12:31     неопределенная ссылка
Ответ Создать тему
Опции темы

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