Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408

Использование .h и .cpp для классов

28.10.2012, 00:23. Показов 3382. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
CSentence.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class CSense_Sentence;
 
class CSentence
{
public:
    CSentence();
    void GetFromKeyboard();
    bool IsConstruction(const string &construction)
    {
        string strbuff;
        for(unsigned int i = 0; i < _words.size(); ++i)
        {
            strbuff += _words[i] + ' ';
        }
 
        return (strbuff.find(construction) != -1);
    }
    CSense_Sentence GetSense();
private:
    void SentenceToWords(const string &sentence);
 
    vector<string> _words;
};



CSentence.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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
#include "CSentence.h"
 
 
CSentence::CSentence()
{
 
}
 
 
void CSentence::GetFromKeyboard()
{
    // считать с клавиатуры
    string sentence;
    bool skipws = cin.flags() & ios::skipws;
    cin >> noskipws >> sentence;
    if(skipws) cin.flags(ios::skipws);
 
 
    // разбить на слова
    SentenceToWords(sentence);
}
 
 
void CSentence::SentenceToWords(const string &sentence)
{
    _words.clear();
    string strbuff;
    
    for(unsigned int i = 0; i < sentence.length(); ++i)
    {
        // считать до пробела или конца предложения
        if(sentence[i] == ' ' || i + 1 == sentence.length())
        {
            // удалить все пробелы
            for(unsigned int j = 0; j < strbuff.length(); ++j)
            {
                if(strbuff[j] == ' ') strbuff.erase(j--, 1);
            }
 
            // если не пустой, то загрузить в вектор
            // и почистить
            if(! strbuff.empty()) 
            {
                _words.push_back(strbuff);
                strbuff.clear();
            }
        }
    }
}
 
 
CSense_Sentence CSentence::GetSense()
{
    CSense_Sentence sen;
    return sen;
}



CSense_Sentence.h
C++
1
2
3
4
5
6
7
class CSense_Sentence
{
public:
    CSense_Sentence();
private:
 
};



CSense_Sentence.cpp
C++
1
2
3
4
5
6
#include "CSense_Sentence.h"
 
CSense_Sentence::CSense_Sentence()
{
 
}



C++
1
error C2027: использование неопределенного типа "CSense_Sentence"
Почему так происходит? Я же разделяю на объявления и реализацию
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2012, 00:23
Ответы с готовыми решениями:

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

Использование различных свойств наследования для расширения и уточнения классов
Помогите решить задачу Среди представленных понятий,( квитанция, накладная, документ, чек), выбрать самое общее, на основе которого...

Использование функции cpp в проекте c
Есть сишный проект, понадобилось прикрепить к нему один готовый плюсовый модуль. Схематичный вид этого модуля: //module.cpp ...

17
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
28.10.2012, 00:28
class CSense_Sentence; — это не определение класса, а его объявление. Просто чтобы чёртов однопроходный компилятор не пугался, когда встретит это имя. Это разрешает только упоминать класс, но не использовать его.

Проинклудьте в CSentence.h файл CSense_Sentence.h, который содержит определение класса. И include-guards не забудьте, чтобы не проинлудить его дважды.
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 00:30  [ТС]
~OhMyGodSoLong~, а как правильно сделать без иклюд-гуарда?
Ведь можно же представить код так, что бы каждый файл включался 1 раз, просто потому, что он включается 1 раз?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.10.2012, 00:32
Цитата Сообщение от Kgfq Посмотреть сообщение
Ведь можно же представить код так, что бы каждый файл включался 1 раз, просто потому, что он включается 1 раз?
Не всё так просто, как кажется! Да и при большом колличестве файлов следить за этим не представляется возможным.
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 00:33  [ТС]
Croessmah, то есть лучше следовать логике: "защищай и не парься"?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
28.10.2012, 00:34
Цитата Сообщение от Kgfq Посмотреть сообщение
~OhMyGodSoLong~, а как правильно сделать без иклюд-гуарда?
Ведь можно же представить код так, что бы каждый файл включался 1 раз, просто потому, что он включается 1 раз?
Можно.
#pragma once
в начале файла. Большинство компиляторов умеют и понимают.

Хотя для тех, кто не понимает, после прагмы обычно всё равно на всякий случай ставят инклюд-гард.

А, вы про то, чтобы руками следить. Да господи, хотите об этом думать вместо того, чтобы один раз написать три строки и забыть, — пожалуйста. В принципе можно, но это вредит читабельности и нервам.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.10.2012, 00:36
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, то есть лучше следовать логике: "защищай и не парься"?
Именно! Меньше ошибок будет
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 00:37  [ТС]
~OhMyGodSoLong~, прагма - это тот же инклюд-гуард, только пишется по-другому
Я имею ввиду, расположить файлы так, что бы они по-любому включались только 1 раз

ну вот пишешь, к примеру есть 3 независимых файла.

#include "A.h"
#include "B.h"
#include "C.h"

и А не включится 2 раза, поскольку включение написано только 1 раз.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.10.2012, 00:39
Цитата Сообщение от Kgfq Посмотреть сообщение
ну вот пишешь, к примеру есть 3 независимых файла.
С тремя файлами это можно контролировать, но чем больше файлов, тем сложнее.
0
28.10.2012, 00:49

Не по теме:

Kgfq, а чем вам там include guard'ы не угодили, что вы решили устроить свою маленькую революцию против них? У нас на собеседовании, например, среди прочего смотрят и на наличие include guard в коде соискателя.

0
28.10.2012, 00:51  [ТС]

Не по теме:

I.M., полагаясь на автоматику мы теряем способности. В данном случае к контроллю кода.

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.10.2012, 00:53
Цитата Сообщение от Kgfq Посмотреть сообщение
I.M., полагаясь на автоматику мы теряем способности. В данном случае к контроллю кода.
Да? Ну попробуйте сделать в отдельных hpp файлах сильно связанные классы.
0
28.10.2012, 00:54

Не по теме:

Kgfq, вы просто оперируете маленькими проектами, где вы сам - царь и бог. Представьте, что вы работаете в команде. И проект, соответственно, крупный. Там наличие include guard просто жизненно необходимо

1
28.10.2012, 00:55

Не по теме:

Цитата Сообщение от Kgfq Посмотреть сообщение
полагаясь на автоматику мы теряем способности.
Вопрос весьма философский.
Отдавая автоматике на откуп многие технические детали, мы оставляем больше простора и энергии для творчества.

1
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 02:31  [ТС]

Не по теме:

John Prick,
I.M.,

Хорошие аргументы, учту на будущее



Добавлено через 1 час 34 минуты
Получается, что одна и та же переменная определена в A.obj и Main.obj. Линкер выдает ошибку. Как с этим бороться?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.10.2012, 02:43
Цитата Сообщение от Kgfq Посмотреть сообщение
Как с этим бороться?
Ключевое слово
C++
1
extern
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 03:07  [ТС]
Croessmah, тогда придется где-то в левом файле определять эту переменную. Иначе - никак?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.10.2012, 03:41
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, тогда придется где-то в левом файле определять эту переменную. Иначе - никак?
в *.h файле пишите
C++
1
extern int g;
в любом *.cpp файле
C++
1
int g=0;
extern только указывает, что это внешняя переменная и объявлена в другом месте
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2012, 03:41
Помогаю со студенческими работами здесь

Использование в CPP переменной, описанной в H
Подскажите, не могу сообразить что делаю не так. Решил перенести в свою библиотеку некоторые функции из своей программы. (Там для...

Использование указателя AP в main.cpp крашит приложение
System.h class System {...}; static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); ...

Использование параметра экземпляра класса из другого cpp
Как использовать параметр экземпляра класса из другого cpp. Вот у меня есть Класс файл Character.h #ifndef _CHARACTER_H_ ...

Использование двух cpp файлов вместо switch case
Доброго времени суток, Я новичек в программировании, так что не судите строго :) Использую VS 2010, написал довольно объемную и...

Использование классов
Класс Члены класса Методы Операторы перегрузки Исходные данные Матрица Размерность ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru