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

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

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

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

26.10.2012, 23:50. Просмотров 1245. Ответов 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
Что я не так делаю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2012, 23:50     Класс: объявление и реализация
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,081
Записей в блоге: 3
Завершенные тесты: 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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
27.10.2012, 00:00     Класс: объявление и реализация #4
Цитата Сообщение от Kgfq Посмотреть сообщение
в таком случае при изменении .h будет перекомпилироваться .cpp
Это нормально. Суть в том, что при изменении CColor.cpp не перекомпилируется main.cpp и наоборот.
А в CColor.h нечему компилироваться. Это не код, а заголовки, подключаемые к файлам срр
С таким же успехом можешь скопипастить содержимое // CColor.h в оба файла срр, а сам h-файл удалить.
(правда вносить изменения в объявление класса будет геморройно)
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
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,081
Записей в блоге: 3
Завершенные тесты: 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.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 00:19     Класс: объявление и реализация #9
Kgfq, да, все ок.
Почитайте, что такое include guard. Как его использовать вам уже написали выше.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,081
Записей в блоге: 3
Завершенные тесты: 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.
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
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,081
Записей в блоге: 3
Завершенные тесты: 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++
Что значит подобное объявление: int f() const; Для чего этот &quot;const&quot; ?

[C++] Объявление строк - C++
Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Разбить исходную строку на две подстроки, причем первая...

Объявление массива - C++
Всем добрый день, очень нужна помощь. Вопрос собственно такой: Объявляется объект class MainClass { MainClass(); ...

Объявление функции - C++
Завдання 1 Створити функцію яка приймає на вхід посилання на карту з ключем цілого типу,та значенням з плаваючою точкою. Другим...

Объявление конструктора - C++
Изучаю книгу Джосьютиса по STL и столкнулся с немного непонятным объявлением конструктора. Помогите разобраться, правильно ли я его...


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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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     Класс: объявление и реализация
Ответ Создать тему
Опции темы

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