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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
#1

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

21.05.2011, 01:13. Просмотров 2115. Ответов 25
Метки нет (Все метки)

Здравствуйте!
В папке лежит несколько файлов: 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 ()()

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

Подскажите с заголовочным файлом - C++
есть заголовочный фаил header.h: #include&lt;iostream.h&gt; void fn_void(int m) { m=9; cout&lt;&lt;m; } и есть основная программа: ...

Программа с заголовочным файлом (с++) - C++
Всем Привет! Недавно стал изучать использование заголовочных файлов в с++ и столкнулся с проблеммой. Написал вот такую программу (она...

Компиляция с заголовочным файлом - C++
Стыдно спрашивать но все же. Никак не пойму как компилировать несколько файлов с заголовочным файлом. Вот что мне отвечает Dev-Cpp ...

Cоздание проги с заголовочным файлом - C++
У меня не получается создать простейшую программку с заголовочным файлом. Я создаю заголовочный файл my.h к примеру такой: void...

Невозможно открыть include с заголовочным файлом - C++
Подскажите решение проблемы что только не пробовал не помогает fatal error C1083: Cannot open include file: 'tinystr.h': No such file or...

работа с файлом - C++
объясните, пожалуйста, что тут происходит. особенно строчку, где ofs.write(reinterpret_cast&lt;char const*&gt;(arr), n * sizeof(*arr)); ...

25
OMAAGAAD
15 / 15 / 3
Регистрация: 24.09.2010
Сообщений: 45
21.05.2011, 01:19 #2
точку с запятой поставь в .h файле, после объявления класса DualSimplex
0
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.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
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 определена
1
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 увидела, и всё заработало.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.05.2011, 09:02 #6
Удали "using namespace std;" из хэдэров. Так делать нельзя.
0
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();', но в чём принципиальное отличие?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.05.2011, 11:10 #8
В том, что используя "using namespace" в хэдэре, пространство имён открывается для всех файлов использующих этот заголовок. Т.е. пространство имён фактически удаляется. В хэдэрах using namespace можно использовать только локально внутри функций.
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.05.2011, 11:14 #9
Lynx607, в том что Вы не будете иметь проблем с конфликтами имен. Вот Вам живой пример, почему сие плохо.
0
Lynx607
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 19
21.05.2011, 11:14  [ТС] #10
Deviaphan, CyBOSSeR, спасибо, теперь понял.
Больше не буду)
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
21.05.2011, 11:16 #11
А я не понял- как это удаляется? Мы прописываем using namespace std и тем самым удаляем это пространство имён? Очень, очень интересно!
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
21.05.2011, 11:19 #12
kravam, Это значит что оно используется теперь везде. Все файлы в которые включен данный хедер автоматом используют using. Хреновая идея, не так-ли?
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
21.05.2011, 11:33 #13
Это я понимаю. А вот в оценке- хреново-не хреново не соглашусь. Используют да и пусть себе используют.
Аналогичную ситуацию наблюдаем со служебными словами. Никому же не приходит в голову использовать while как заблагорассудится- и ничё, никто не жужжит (по сути тоже есть пространство имён, в которое входят ВСЕ служебные слова, только оно объявляется неявно). Короче суть я понял, неудобств мне это не доставит.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
21.05.2011, 11:35 #14
kravam, Использование директивы using namespace доставит. Еще каких.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
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 неправильно.
0
21.05.2011, 11:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2011, 11:43
Привет! Вот еще темы с ответами:

Работа с файлом - C++
Помогите доделать программу. Необходимо создать файл структуры: фамилия абонентов, год установки телефона, номер телефона. Программу...

Работа с файлом - C++
Программа для записи/прочитки текстовых файлов. Почему когда ввожу строку, в файл сохраняется только часть строки(до первого пробела)? ...

Работа с файлом - C++
вот смотрите есть файл chisla.txt В нем содержатся цифры ( Например 101 258 164) Как мне изъять из файла ТОЛЬКО 1 число (например 101)???

c++ работа с файлом - C++
Здраствуйте,в си знания - средненькие,мне предоставилась задача - нужно згенерировать файл для ипфильтра торрента,с сайта провайдера мне...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru