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

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

Войти
Регистрация
Восстановить пароль
 
Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
#1

компоновка программ - C++

18.12.2012, 19:02. Просмотров 741. Ответов 12
Метки нет (Все метки)

Вопрос собственно про сборку программ из хидеров и сишников. Не понятно пока, если мы можем описывать классы в ашниках, то почему всю программу в них не писать, и потом к мейновскому файлу не подключать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2012, 19:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос компоновка программ (C++):

Компоновка - C++
Я недавно начал изучать язык по книге Дейтелов, и у меня есть вопрос по компоновке программы, а точнее по картинке...

Компоновка хедеров - C++
Собственно вот такая проблема. Есть два файла first.h; second.h; каждый из них #include "vector.h"; И есть ещё файл tester.h; ...

Компоновка MFC с OCX-файлом - C++
Доброе время суток! Намедни я столкнулся с проблемой регистрации OCX'а. По совету Boombastic'а я сделал релизный конфиг активным и от...

Внутренняя компоновка с модификатором const - C++
Привет. Читаю Страуструпа "Язык программирования С++". Глава 9: Я не понимаю как используются эти 2 файла (file1.c & file2.c) в...

компоновка полей struct в памяти - C++
Подскажите ленивому тупому, которому лень Страустрапа почитать, как компонуются поля структуры в памяти? Меня интересует конкретный...

Компиляция, компоновка, линковка (undefined reference to.) - C++
Описывать особо нечего, по-этому просто приведу файлы. Вопрос: что я делаю не так, почему внутри cpp не видно всё, что объявлено в hpp? ...

12
Ares_Sorokin
0 / 0 / 0
Регистрация: 21.09.2012
Сообщений: 6
18.12.2012, 19:31 #2
Вот причина,если у нас большой класс со множеством данных и методов,то в нем намного проще ориентироваться,если в нем будет отсутствовать реализация. Поэтому в ашниках хранятся объявления данных и прототипы методов.За некоторыми исключениями конечно.
Хотя ни что не мешает тебе все в куче держать.
Надеюсь правильно понял вопрос)
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
18.12.2012, 19:49 #3
Дело даже не в этом, если в .h написать реализацию, то при подключении файла более чем 1 раз будет ошибка компиляции что-нибудь типа "функция void func() уже определена в файле somefile.cpp".
Да и вообще так исторически сложилось, что в .h пишутся прототипы, за редким исключением.
1
Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
18.12.2012, 20:09  [ТС] #4
Спасибо, стало ясно.
Задам тут же вопрос, раз топик открыт: Чем отличаются структуры от классов?
0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
18.12.2012, 20:13 #5
Цитата Сообщение от Greeezly Посмотреть сообщение
Чем отличаются структуры от классов?
Тем, что по умолчанию модификатор доступа в struct равен public, а в классах - private

C++
1
2
3
4
class B
{
int a;
};
a - закрытая переменная. Аналогично

C++
1
2
3
4
5
class B
{
private:
int a;
}
А в

C++
1
2
3
4
struct B
{
int a;
};
аналогично

C++
1
2
3
4
5
struct B
{
public:
int a;
};
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
18.12.2012, 20:26 #6
Ну и наследование тоже в структурах по дефолту public, а в классах private.
0
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
18.12.2012, 20:42 #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дело даже не в этом, если в .h написать реализацию, то при подключении файла более чем 1 раз будет ошибка компиляции что-нибудь типа "функция void func() уже определена в файле somefile.cpp".
???
C++
1
2
3
4
5
6
#ifndef HEADER_HPP
#define HEADER_HPP
namespace name{
...
}
#endif
Цитата Сообщение от Greeezly Посмотреть сообщение
Не понятно пока, если мы можем описывать классы в ашниках, то почему всю программу в них не писать, и потом к мейновскому файлу не подключать?
header.hpp содержит класс(ы) с прототипами методов, методы реализуются в объектных модулях, ну или сразу запилить их в библиотеку, не важно. Суть в том, чтобы сформировать множество абстрактных исчерпывающих методов класса. В main'е же мы оперируем уже готовыми методами как нам угодно и на свое усмотрение, а сам класс при этом остается неизменным (ну или время от времени перекомпилируется по мере выявления багов). Т.е. представь что ты пишешь класс не для отдельно взятой задачи, а для множества задач подобного типа на конечном, но не определенном заранее, временном промежутке. Двумя словами "раз и навсегда".

Добавлено через 3 минуты
Цитата Сообщение от activnaya Посмотреть сообщение
???
ааа, я поняла. конечно нельзя реализовывать метод одновременно и в header'е и *.C'шнике
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
18.12.2012, 20:54 #8
Цитата Сообщение от activnaya Посмотреть сообщение
???
C++
1
2
3
4
5
6
#ifndef HEADER_HPP
#define HEADER_HPP
namespace name{
...
}
#endif
И?


Добавлено через 40 секунд

Не по теме:

Цитата Сообщение от activnaya Посмотреть сообщение
Добавлено через 3 минуты

ааа, я поняла. конечно нельзя реализовывать метод одновременно и в header'е и *.C'шнике
опоздал, написал пост до этого добавления



Добавлено через 5 минут
Цитата Сообщение от activnaya Посмотреть сообщение
ааа, я поняла. конечно нельзя реализовывать метод одновременно и в header'е и *.C'шнике
дело не совсем в этом. Вот пример
C++
1
2
3
4
5
6
7
//file.h
#ifndef HEADER_HPP
#define HEADER_HPP
namespace name {
    void f(){}
}
#endif
C++
1
2
//file1.cpp
#include "file.h"
C++
1
2
//file2.cpp
#include "file.h"
при компиляции получим
Bash
1
2
3
:tmp1.cpp:(.text+0x0): multiple definition of name::f()
:tmp2.cpp:(.text+0x0): first defined here
collect2: выполнение ld завершилось с кодом возврата 1
0
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
18.12.2012, 21:37 #9
Kastaneda,
Bash
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
bash$ cat tmp.hpp tmp.C tmp1.C
//____________TMP_HPP______________
 
#ifndef TMP_HPP
#define TMP_HPP
 
#include <iostream>
 
namespace name
{
    class A
    {
    public:
        A(){}
        ~A(){}
        void foo(const char *str)
        {
            std::cout << str;
        }
    };
};
 
#endif
//___________TMP.C______________
 
#include <iostream>
#include "tmp.hpp"
 
void bar()
{
    name::A a;
    a.foo("I'm bar. called name::A::a.foo()\n");
}
//_____________tmp1.C_____________
 
#include "tmp.hpp"
 
extern void bar();
 
int main()
{
    name::A b;
    bar();
    b.foo("I'm main. called object name::A::b.foo()\n");
 
    return 0;
}
bash$ g++ tmp.C tmp1.C
bash$ ./a.out 
I'm bar. called name::A::a.foo()
I'm main. called object name::A::b.foo()
bash$
Добавлено через 1 минуту
в tmp.C директива #include конечно лишняя. Забыла просто ее убрать.

Добавлено через 6 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот пример
кстати этот пример немного некорректен т.к. используется структурный подход. В данном случае речь идет об ООП, классах и методах.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.12.2012, 21:59 #10
Цитата Сообщение от activnaya Посмотреть сообщение
кстати этот пример немного некорректен т.к. используется структурный подход. В данном случае речь идет об ООП, классах и методах.

Не по теме:

Некоторые вещи хорошо выражаются именно глобальными функциями. Статический метод класса, метод синглтона или просто глобальная функция в неймспейсе — не суть важно. От этого менее глобальными они не становятся. А утверждать, что глобальные функции в неймспейсах ересь, — это ООП головного мозга.


Наоборот, это вы лукавите с extern void bar();. Это то же самое, что подключить h-файл с прототипом в этом месте. Это не контрпример к проблеме повторного определения.
1
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
18.12.2012, 22:18 #11
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А утверждать, что глобальные функции в неймспейсах ересь, — это ООП головного мозга.
и как же тогда решить проблему повторного определения? если не прибегать к показанному мной способу в виде extern void bar();

Добавлено через 5 минут
ну понятно. прототип же.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
18.12.2012, 22:36 #12
Цитата Сообщение от activnaya Посмотреть сообщение
и как же тогда решить проблему повторного определения?
inline. Кстати, в последнем примере с методом класса этот метод inline. Определить его вне класса - та же ошибка линковки.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
19.12.2012, 05:20 #13
activnaya, ну как бы суть уже сказали
Цитата Сообщение от gray_fox Посмотреть сообщение
Кстати, в последнем примере с методом класса этот метод inline. Определить его вне класса - та же ошибка линковки.
а инлайн функции/методы имеют область видимости, ограниченную файлом. Поэтому в этом примере можно было бы обойтись даже без нэймспейсов, все бы так же работало.
0
19.12.2012, 05:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 05:20
Привет! Вот еще темы с ответами:

Компоновка всей программы в один файл - C++
Можно ли сделать так, чтоб при построение программы она, включая все внешние картинки, звуковые файлы, редистрюбитивы VC и пр компоновались...

Переполнение стека и несовместимая компоновка dll - C++
Добрый день. Сегодня сижу и целый день что то пишу) Так как до этого просто страдал фигнёй и ни чего не делал, вот и забыл почти всё( ...

Компоновка программы (подключение объектного модуля к проекту) - C++
Подскажите пожалуйста. Пытаюсь в VS2010 подключить к консольному проекту MultiFile объектный файл другого проекта AddFile.obj для...

Первый вопрос из книги вильямса:Что такое компоновка - C++
что такое компоновка?Я читал в кyиге и понял что компоновка превращает файл срр в obj, так?тогда что такое obj, и почему сразу не cjздать...


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

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

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