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

Класс: объявление и реализация - C++

Восстановить пароль Регистрация
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
26.10.2012, 23:50     Класс: объявление и реализация #1
CColor.h
C++
1
2
3
4
5
6
7
8
9
10
11
// CColor.h
class CColor
{
public:
    CColor();
    CColor(Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a);
    void operator()(Uint8 _r, Uint8 _g, Uint8 _b);
    void operator()(Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a);
 
    Uint8 r, g, b, a;
};



CColor.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
// CColor.cpp
CColor::CColor()
{
    operator()(0, 0, 0, 255);
}
 
 
CColor::CColor(Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a = 255)
{
    operator()(_r, _g, _b, _a);
}
 
 
void CColor::operator()(Uint8 _r, Uint8 _g, Uint8 _b)
{
    r = _r;
    g = _g;
    b = _b;
}
 
 
void CColor::operator()(Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a)
{
    r = _r;
    g = _g;
    b = _b;
    a = _a;
}



Main.cpp
C++
1
2
3
4
5
6
7
8
9
// Main.cpp
#define Uint8 unsigned char
#include "CColor.h"
 
int main()
{
 
return 0;
}



Целый косяк ошибок в CColor.cpp
Он не знает, что такое Uint8
Не знает, что такое CColor
Что я не так делаю?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
26.10.2012, 23:54     Класс: объявление и реализация #2
C++
1
#define Uint8 unsigned char
перенесите в CColor.h
в CColor.cpp добавьте
C++
1
#include "CColor.h"
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
26.10.2012, 23:55  [ТС]     Класс: объявление и реализация #3
Croessmah, в таком случае при изменении .h будет перекомпилироваться .cpp
зачем тогда выносить в отдельный модуль?

И, еще: тогда .h будет включено дважды. Опять же - разве это правильно?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
27.10.2012, 00:00     Класс: объявление и реализация #4
Цитата Сообщение от Kgfq Посмотреть сообщение
в таком случае при изменении .h будет перекомпилироваться .cpp
Это нормально. Суть в том, что при изменении CColor.cpp не перекомпилируется main.cpp и наоборот.
А в CColor.h нечему компилироваться. Это не код, а заголовки, подключаемые к файлам срр
С таким же успехом можешь скопипастить содержимое // CColor.h в оба файла срр, а сам h-файл удалить.
(правда вносить изменения в объявление класса будет геморройно)
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
27.10.2012, 00:01     Класс: объявление и реализация #5
C++
1
#pragma once
в хидере обЪяви. тогда только раз будет включен заголовочный файл.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
27.10.2012, 00:01  [ТС]     Класс: объявление и реализация #6
Kuzia domovenok, то есть прототипы ни на байт не увеличивают размер .exe?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
27.10.2012, 00:04     Класс: объявление и реализация #7
Цитата Сообщение от Kgfq Посмотреть сообщение
И, еще: тогда .h будет включено дважды. Опять же - разве это правильно?
C++
1
2
3
4
#ifndef КОНСТАНТА
#define КОНСТАНТА
//Объявление класса
#endif
защитит от повторного включения

Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, в таком случае при изменении .h будет перекомпилироваться .cpp
зачем тогда выносить в отдельный модуль?
В этом суть раздельной компиляции - компилируются только файлы, которые зависят от измененных файлов.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
27.10.2012, 00:16  [ТС]     Класс: объявление и реализация #8
Croessmah, нет, вы не поняли. По-любому .h включается в мэйне. И точно так же по-любому оно включается в .cpp. Разве получится не двойное включение?

да и еще, это нормально?

C++
1
2
3
4
5
6
7
// h
#include <string>
class A
{
public:
void Str(string a);
};
C++
1
2
3
4
5
6
7
// cpp
#include "A.h"
 
void A::Str(string a)
{
 
}

Ведь тогда стринг тоже будет включен 2 раза. Это разве нормально?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 00:19     Класс: объявление и реализация #9
Kgfq, да, все ок.
Почитайте, что такое include guard. Как его использовать вам уже написали выше.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
27.10.2012, 00:21     Класс: объявление и реализация #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, нет, вы не поняли. По-любому .h включается в мэйне. И точно так же по-любому оно включается в .cpp. Разве получится не двойное включение?
почитайте подробнее про процесс компиляции программы.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
27.10.2012, 00:22  [ТС]     Класс: объявление и реализация #11
I.M., я прекрасно знаю, как его использовать и что это такое. Но тут у меня когнитивный диссонанс:

для модуля main не существует .срр, поэтому он нормально кушает <string>
для модуля .cpp не существует main, поэтому он опять же нормально кушает <string>

получается <string> присутствует и в main.o и в a.o
как они потом стыкуются в exe так, что используется только один из <string>?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 00:25     Класс: объявление и реализация #12
В каком файле раньше подключили заголовок, тот заголовок и будет использоваться. Остальные вхождения этого же заголовка будут пропущены
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
27.10.2012, 00:27  [ТС]     Класс: объявление и реализация #13
I.M., блин. Я не о том. Проиклюден <string> будет и в main.o и в a.o, так?
потому что они друг друга банально не видят
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
27.10.2012, 00:30     Класс: объявление и реализация #14
Цитата Сообщение от Kgfq Посмотреть сообщение
I.M., блин. Я не о том. Проиклюден <string> будет и в main.o и в a.o, так?
потому что они друг друга банально не видят
Почитайте как работают препроцессор-транслятор-ассемблер-линковщик
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2012, 03:02     Класс: объявление и реализация
Еще ссылки по теме:

Класс, производный класс, паблик-класс C++
C++ Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс
C++ Класс Complex, реализация операций и перегрузки

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
27.10.2012, 03:02     Класс: объявление и реализация #15
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, нет, вы не поняли. По-любому .h включается в мэйне. И точно так же по-любому оно включается в .cpp. Разве получится не двойное включение?
Теперь понял вопрос. Ты думаешь, что при сборке проекта из нескольких файлов, cpp файлы просто "суммируются". Нет, ты не прав. Почитай как происходит компиляция, линковка и.т.п.

Коротко: файлы компилируются независимо друг от друга. Для успешной компиляции файла main, использующего функции из другого файла, например void CColor::operator(),
совершенно не обязательно прибавлять к main.cpp текст с реализацией функции CColor::operator(),
Достаточно написать в начале файла одну строчку - объявление этой функции (в нашем случае класса с этой функцией).
При этом компилятор просто проверит "правильность грамматики" (что типы аргументов и возвращаемого значения функции подходят), а связь с куском программы с реализацией этой функции произойдёт уже после компиляции. Этим займётся linker, линковщик.

Видишь! Ты создаёшь проект из нескольких файлов.
В начале каждого файла или объявляешь прототипы функций и классов из внешних файлов,
или обычно(хоть и не всегда) объявления выносятся в .h файл,
вот он то как раз напрямую пришивается к тексту программы в данном cpp файле.
Далее совершенно не беспокоишься, что функции в другом файле, спокойно вызываешь их. СРР-файлы при компиляции не "суммируются", они просто свяжутся позже.
Yandex
Объявления
27.10.2012, 03:02     Класс: объявление и реализация
Ответ Создать тему
Опции темы

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