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

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

Войти
Регистрация
Восстановить пароль
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
#1

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

26.10.2012, 23:50. Просмотров 1298. Ответов 14
Метки нет (Все метки)

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
Что я не так делаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2012, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс: объявление и реализация (C++):

Класс объявление с элементом типа класс Текст - C++
Необработанное исключение в "0x770015de" в "FAQ.exe": 0xC0000005: Нарушение прав доступа при записи...

Объявление класс в нескольких файлах - C++
Можноли как-то объявление одного класса разбить на несколько заголовочных файлов? Хочу создать класс, в котором основной функционал...

Шаблонный класс для работы с разными типами данных и объявление методов в main - C++
есть класс шаблонный, но не могу объявить методы в main и сделать длядругих типов :(когда делала через шаблонные функции, то программа...

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

Шаблонный класс list, собственная реализация - C++
Привет всем. Я по чуть-чуть пишу шаблонный класс list с добавлением элементов в начало списка. Уже на свой страх и риск реализовал три...

Класс Complex, реализация операций и перегрузки - C++
Ребят подскажите пожалуйста в чём ошибка, задание таково : Комплексное число представляются парой действительных чисел (a,b), где а- действ...

14
Croessmah
Эксперт CЭксперт С++
13512 / 7670 / 866
Регистрация: 27.09.2012
Сообщений: 18,870
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 23:54 #2
C++
1
#define Uint8 unsigned char
перенесите в CColor.h
в CColor.cpp добавьте
C++
1
#include "CColor.h"
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
26.10.2012, 23:55  [ТС] #3
Croessmah, в таком случае при изменении .h будет перекомпилироваться .cpp
зачем тогда выносить в отдельный модуль?

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

Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, в таком случае при изменении .h будет перекомпилироваться .cpp
зачем тогда выносить в отдельный модуль?
В этом суть раздельной компиляции - компилируются только файлы, которые зависят от измененных файлов.
0
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 раза. Это разве нормально?
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 00:19 #9
Kgfq, да, все ок.
Почитайте, что такое include guard. Как его использовать вам уже написали выше.
0
Croessmah
Эксперт CЭксперт С++
13512 / 7670 / 866
Регистрация: 27.09.2012
Сообщений: 18,870
Записей в блоге: 3
Завершенные тесты: 1
27.10.2012, 00:21 #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, нет, вы не поняли. По-любому .h включается в мэйне. И точно так же по-любому оно включается в .cpp. Разве получится не двойное включение?
почитайте подробнее про процесс компиляции программы.
0
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>?
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 00:25 #12
В каком файле раньше подключили заголовок, тот заголовок и будет использоваться. Остальные вхождения этого же заголовка будут пропущены
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
27.10.2012, 00:27  [ТС] #13
I.M., блин. Я не о том. Проиклюден <string> будет и в main.o и в a.o, так?
потому что они друг друга банально не видят
0
Croessmah
Эксперт CЭксперт С++
13512 / 7670 / 866
Регистрация: 27.09.2012
Сообщений: 18,870
Записей в блоге: 3
Завершенные тесты: 1
27.10.2012, 00:30 #14
Цитата Сообщение от Kgfq Посмотреть сообщение
I.M., блин. Я не о том. Проиклюден <string> будет и в main.o и в a.o, так?
потому что они друг друга банально не видят
Почитайте как работают препроцессор-транслятор-ассемблер-линковщик
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
27.10.2012, 03:02 #15
Цитата Сообщение от Kgfq Посмотреть сообщение
Croessmah, нет, вы не поняли. По-любому .h включается в мэйне. И точно так же по-любому оно включается в .cpp. Разве получится не двойное включение?
Теперь понял вопрос. Ты думаешь, что при сборке проекта из нескольких файлов, cpp файлы просто "суммируются". Нет, ты не прав. Почитай как происходит компиляция, линковка и.т.п.

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

Видишь! Ты создаёшь проект из нескольких файлов.
В начале каждого файла или объявляешь прототипы функций и классов из внешних файлов,
или обычно(хоть и не всегда) объявления выносятся в .h файл,
вот он то как раз напрямую пришивается к тексту программы в данном cpp файле.
Далее совершенно не беспокоишься, что функции в другом файле, спокойно вызываешь их. СРР-файлы при компиляции не "суммируются", они просто свяжутся позже.
1
27.10.2012, 03:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2012, 03:02
Привет! Вот еще темы с ответами:

Красно-черное дерево (класс, шаблон и его реализация) - C++
всем привет, у меня возникла проблема в создании шаблона, в обычном виде т.е. в не шаблонном, он работает нормально НО как только пытаюсь...

Вывод данных из файла, реализация через класс работает неправильно - C++
P.S плохо с русским Вот код решил использовать знание на проверку но вот толька через класс вывод инфо не хочет #include...

Класс: Реализация через битовое поле класса "Множество" - C++
Реализация через битовое поле. Как сделать ввод и вывод множества и так чтобы элементы хранились в отсортированном порядке? #include...

Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс - C++
Доброго времени суток! Осваивая UML, решил реализовать отношение двунаправленной ассоциации по диаграмме: У одного владельца...


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

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

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