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

работа с заголовочным файлом - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
21.05.2011, 01:13     работа с заголовочным файлом #1
Здравствуйте!
В папке лежит несколько файлов: main.cpp, dualsimplex.h, dualsimplex.cpp
Задача: в main.cpp создать объект класса 'DualSimplex' и вызвать функцию 'SetData'

main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "dualsimplex.h"
#include <iostream>
using namespace std;
 
int main ()
{
    DualSimplex problem;
    problem.SetData ();
        
    return 0;
}
dualsimplex.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef DUALSIMPLEX_H
#define DUALSIMPLEX_H
 
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
 
class DualSimplex
{
...
public:
    DualSimplex();
    void SetData();
    void SetData( string in );
}
dualsimplex.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
#include "dualsimplex.h"
#include "tools.h"
#include <iostream> 
#include <fstream>
#include <sstream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
 
DualSimplex::DualSimplex()
{
    for ( int i = 0; i < MAX_NUMBER_OF_VARIABLES; i++ )
    {
        b[i] = 0;
        dual_s[i] = 0;
    }
...
}
 
void DualSimplex::SetData()
{
    char sType[3];
    cout << "Enter the type of problem (\"max\" or \"min\"): ";
    cin >> sType;
    cout << endl;
...
}
компилирую:
Bash
1
2
3
4
5
g++ main.cpp -o test
/tmp/cczMYHXr.o: In function `main':
main.cpp:(.text+0x7a): undefined reference to `DualSimplex::DualSimplex()'
main.cpp:(.text+0x88): undefined reference to `DualSimplex::SetData()'
collect2: ld returned 1 exit status
почитал, что умные люди пишут - заменил в main.cpp 'DualSimplex problem;' на 'DualSimplex problem();':
Bash
1
2
3
g++ main.cpp -o test
main.cpp: In function ‘int main()’:
main.cpp:9: error: request for member ‘SetData’ in ‘problem’, which is of non-class type ‘DualSimplex ()()

Не могу понять - небольшие изменения, а ошибки подключения переходят в ошибки вызова функций класса. Почему?
И как правильно создать объект, а потом вызвать функцию?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2011, 01:13     работа с заголовочным файлом
Посмотрите здесь:

C++ Cоздание проги с заголовочным файлом
работа с файлом C++
Работа с файлом C++
C++ Работа с файлом
Компиляция с заголовочным файлом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OMAAGAAD
15 / 15 / 3
Регистрация: 24.09.2010
Сообщений: 45
21.05.2011, 01:19     работа с заголовочным файлом #2
точку с запятой поставь в .h файле, после объявления класса DualSimplex
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
21.05.2011, 01:43  [ТС]     работа с заголовочным файлом #3
извините, не дописал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef DUALSIMPLEX_H
#define DUALSIMPLEX_H
 
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
 
class DualSimplex
{
...
public:
    DualSimplex();
    void SetData();
    void SetData( string in );
};
 
 
#endif // DUALSIMPLEX_H
Добавлено через 15 минут
Класс взят из рабочей проги, так что проблема скорее всего в main.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
21.05.2011, 01:46     работа с заголовочным файлом #4
Стоп, если тебе надо создать объект класса DualSimplex, то ты всё правильно пишешь... Короче, main.cpp у тебя верный (DualSimplex problem() определение функции problem, возвращающей переменную типа DualSimplex, сия херь тебе даром не нужна.)

По поводу компиляции, здесь посмотри
Как в DEV C++ добавить опцию компилятора *cpp?

В сообщении N 7 я озвучил некоторый вывод.. Применительно к твоему случаю компиляция будет выглядет так:
g++ main.cpp dualsimplex.cpp -o test

Про точку с запяой тебе сказали, вроде всё. Надеюсь tools.h у тебя присутствует и MAX_NUMBER_OF_VARIABLES определена
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
21.05.2011, 02:04  [ТС]     работа с заголовочным файлом #5
kravam, спасибо!

Сделал main как в начале поста, компиляцию выполнил так:
g++ main.cpp dualsimplex.cpp tools.cpp -o test

чтобы программа ещё и tools увидела, и всё заработало.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.05.2011, 09:02     работа с заголовочным файлом #6
Удали "using namespace std;" из хэдэров. Так делать нельзя.
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
21.05.2011, 11:05  [ТС]     работа с заголовочным файлом #7
to Deviaphan
Можете объяснить почему так делать нельзя? В Страуструпе(http://citforum.ru/programming/cpp/gl4.shtml) ничего про это не написано.

В .h-файле есть объявление 'string GetCanonicalForm();'
Можно сделать 'std::string GetCanonicalForm();', но в чём принципиальное отличие?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.05.2011, 11:10     работа с заголовочным файлом #8
В том, что используя "using namespace" в хэдэре, пространство имён открывается для всех файлов использующих этот заголовок. Т.е. пространство имён фактически удаляется. В хэдэрах using namespace можно использовать только локально внутри функций.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.05.2011, 11:14     работа с заголовочным файлом #9
Lynx607, в том что Вы не будете иметь проблем с конфликтами имен. Вот Вам живой пример, почему сие плохо.
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
21.05.2011, 11:14  [ТС]     работа с заголовочным файлом #10
Deviaphan, CyBOSSeR, спасибо, теперь понял.
Больше не буду)
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
21.05.2011, 11:16     работа с заголовочным файлом #11
А я не понял- как это удаляется? Мы прописываем using namespace std и тем самым удаляем это пространство имён? Очень, очень интересно!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.05.2011, 11:19     работа с заголовочным файлом #12
kravam, Это значит что оно используется теперь везде. Все файлы в которые включен данный хедер автоматом используют using. Хреновая идея, не так-ли?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
21.05.2011, 11:33     работа с заголовочным файлом #13
Это я понимаю. А вот в оценке- хреново-не хреново не соглашусь. Используют да и пусть себе используют.
Аналогичную ситуацию наблюдаем со служебными словами. Никому же не приходит в голову использовать while как заблагорассудится- и ничё, никто не жужжит (по сути тоже есть пространство имён, в которое входят ВСЕ служебные слова, только оно объявляется неявно). Короче суть я понял, неудобств мне это не доставит.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.05.2011, 11:35     работа с заголовочным файлом #14
kravam, Использование директивы using namespace доставит. Еще каких.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
21.05.2011, 11:43     работа с заголовочным файлом #15
А чё оно доставит-то? Есть слова, определённые в нём. Например cout. Если бы я использовал cout В ДРУГОМ КОНТЕКСТЕ нежели
C++
1
2
3
4
5
6
#include <iostream>
using namespace std;
 
int main(){
 cout<< "Hello, word!";
}
Ну то есть не используя
C++
1
2
#include <iostream>
using namespace std;
я считал бы себя неумёхой.
Посмотрим, в общем.

Добавлено через 59 секунд
то есть будут проблемы- и поделом мне, не фиг использовать cout неправильно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.05.2011, 11:44     работа с заголовочным файлом #16
kravam, В std слишком много всего) Например тот же max или min. Все время выбирать нечто ради того, чтобы не пересечься с пространством имен... Ну это как минимум глупо.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
21.05.2011, 11:49     работа с заголовочным файлом #17
Да не, я просто помню служебные слова. Вот Вы помните служебные слова C? А я буду помнить служебные слова STD- раз использовал и запомнил.
А может и не буду. Но до сих пор всегда помнил.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.05.2011, 21:58     работа с заголовочным файлом #18
kravam, Все?) Ну перечислите с 10-к...

Кстати. th_element - функция STL?
а get_temporary_buffer?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.05.2011, 00:32     работа с заголовочным файлом #19
Я говорю, стоит один раз использовать имя как имя из пространства std, сразу запомнится; а я эти имена не использовал, поэтому за них ничего не знаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2011, 00:34     работа с заголовочным файлом
Еще ссылки по теме:

C++ Программа с заголовочным файлом (с++)
C++ Подскажите с заголовочным файлом
Невозможно открыть include с заголовочным файлом C++

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

Или воспользуйтесь поиском по форуму:
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
22.05.2011, 00:34  [ТС]     работа с заголовочным файлом #20
Господа, у kravam в подписи к нику всё ясно написано. Да и вообще, использовать или нет 'using namespace std;' в h-файлах, каждый решает сам - Вы согласны?
Yandex
Объявления
22.05.2011, 00:34     работа с заголовочным файлом
Ответ Создать тему
Опции темы

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