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

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

Восстановить пароль Регистрация
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 00:23     Использование .h и .cpp для классов #1
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"
Почему так происходит? Я же разделяю на объявления и реализацию
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2012, 00:23     Использование .h и .cpp для классов
Посмотрите здесь:

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов C++
Использование классов C++
Использование различных свойств наследования для расширения и уточнения классов C++
C++ Использование функции cpp в проекте c
C++ Использование параметра экземпляра класса из другого cpp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
28.10.2012, 00:28     Использование .h и .cpp для классов #2
class CSense_Sentence; — это не определение класса, а его объявление. Просто чтобы чёртов однопроходный компилятор не пугался, когда встретит это имя. Это разрешает только упоминать класс, но не использовать его.

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

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

А, вы про то, чтобы руками следить. Да господи, хотите об этом думать вместо того, чтобы один раз написать три строки и забыть, — пожалуйста. В принципе можно, но это вредит читабельности и нервам.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11830 / 6809 / 769
Регистрация: 27.09.2012
Сообщений: 16,883
Записей в блоге: 2
Завершенные тесты: 1
28.10.2012, 00:36     Использование .h и .cpp для классов #7
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, то есть лучше следовать логике: "защищай и не парься"?
Именно! Меньше ошибок будет
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 00:37  [ТС]     Использование .h и .cpp для классов #8
~OhMyGodSoLong~, прагма - это тот же инклюд-гуард, только пишется по-другому
Я имею ввиду, расположить файлы так, что бы они по-любому включались только 1 раз

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

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

и А не включится 2 раза, поскольку включение написано только 1 раз.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11830 / 6809 / 769
Регистрация: 27.09.2012
Сообщений: 16,883
Записей в блоге: 2
Завершенные тесты: 1
28.10.2012, 00:39     Использование .h и .cpp для классов #9
Цитата Сообщение от Kgfq Посмотреть сообщение
ну вот пишешь, к примеру есть 3 независимых файла.
С тремя файлами это можно контролировать, но чем больше файлов, тем сложнее.
I.M.
28.10.2012, 00:49
  #10

Не по теме:

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

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

Не по теме:

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

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11830 / 6809 / 769
Регистрация: 27.09.2012
Сообщений: 16,883
Записей в блоге: 2
Завершенные тесты: 1
28.10.2012, 00:53     Использование .h и .cpp для классов #12
Цитата Сообщение от Kgfq Посмотреть сообщение
I.M., полагаясь на автоматику мы теряем способности. В данном случае к контроллю кода.
Да? Ну попробуйте сделать в отдельных hpp файлах сильно связанные классы.
I.M.
28.10.2012, 00:54
  #13

Не по теме:

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

John Prick
28.10.2012, 00:55
  #14

Не по теме:

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

Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 02:31  [ТС]     Использование .h и .cpp для классов #15

Не по теме:

John Prick,
I.M.,

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



Добавлено через 1 час 34 минуты
Получается, что одна и та же переменная определена в A.obj и Main.obj. Линкер выдает ошибку. Как с этим бороться?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11830 / 6809 / 769
Регистрация: 27.09.2012
Сообщений: 16,883
Записей в блоге: 2
Завершенные тесты: 1
28.10.2012, 02:43     Использование .h и .cpp для классов #16
Цитата Сообщение от Kgfq Посмотреть сообщение
Как с этим бороться?
Ключевое слово
C++
1
extern
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.10.2012, 03:07  [ТС]     Использование .h и .cpp для классов #17
Croessmah, тогда придется где-то в левом файле определять эту переменную. Иначе - никак?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 03:41     Использование .h и .cpp для классов
Еще ссылки по теме:

Использование указателя AP в main.cpp крашит приложение C++
C++ Использование двух cpp файлов вместо switch case
C++ Использование в CPP переменной, описанной в H

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11830 / 6809 / 769
Регистрация: 27.09.2012
Сообщений: 16,883
Записей в блоге: 2
Завершенные тесты: 1
28.10.2012, 03:41     Использование .h и .cpp для классов #18
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, тогда придется где-то в левом файле определять эту переменную. Иначе - никак?
в *.h файле пишите
C++
1
extern int g;
в любом *.cpp файле
C++
1
int g=0;
extern только указывает, что это внешняя переменная и объявлена в другом месте
Yandex
Объявления
28.10.2012, 03:41     Использование .h и .cpp для классов
Ответ Создать тему
Опции темы

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