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

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2012, 00:23
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

и А не включится 2 раза, поскольку включение написано только 1 раз.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
28.10.2012, 00:39 9
Цитата Сообщение от Kgfq Посмотреть сообщение
ну вот пишешь, к примеру есть 3 независимых файла.
С тремя файлами это можно контролировать, но чем больше файлов, тем сложнее.
0
I.M.
28.10.2012, 00:49
  #10

Не по теме:

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

0
Kgfq
28.10.2012, 00:51  [ТС]
  #11

Не по теме:

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

0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
28.10.2012, 00:53 12
Цитата Сообщение от Kgfq Посмотреть сообщение
I.M., полагаясь на автоматику мы теряем способности. В данном случае к контроллю кода.
Да? Ну попробуйте сделать в отдельных hpp файлах сильно связанные классы.
0
I.M.
28.10.2012, 00:54
  #13

Не по теме:

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

1
John Prick
28.10.2012, 00:55
  #14

Не по теме:

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

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

Не по теме:

John Prick,
I.M.,

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



Добавлено через 1 час 34 минуты
Получается, что одна и та же переменная определена в A.obj и Main.obj. Линкер выдает ошибку. Как с этим бороться?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
28.10.2012, 02:43 16
Цитата Сообщение от Kgfq Посмотреть сообщение
Как с этим бороться?
Ключевое слово
C++
1
extern
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 03:07  [ТС] 17
Croessmah, тогда придется где-то в левом файле определять эту переменную. Иначе - никак?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
28.10.2012, 03:41 18
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, тогда придется где-то в левом файле определять эту переменную. Иначе - никак?
в *.h файле пишите
C++
1
extern int g;
в любом *.cpp файле
C++
1
int g=0;
extern только указывает, что это внешняя переменная и объявлена в другом месте
1
28.10.2012, 03:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2012, 03:41
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru