Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
1

Программа взаимодействует с классом исключительно через интерфейс. Однажды класс меняется и меняется его хидер. Надо ли перекомпилировать всю программ

09.03.2013, 16:18. Показов 854. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Программа взаимодействует с классом исключительно через интерфейс. Однажды класс меняется и меняется его хидер. Надо ли перекомпилировать всю программу?

То есть я однажды задавал подобный вопрос, но там не было промежуточного звена "абстрактный класс" между программой и объектом, а тут есть. Итак, main.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
//main.cpp
#include <windows.h>
#include <stdio.h>
 
//Тут обявлен абстрактный класс pechat
#include "pechat.h"
 
//А тут обыкновенный, неабстрактный класс
//назовём его статическим
//Он производный от абстрактного
#include "pechat_treu.h"
 
 
int main() {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 
 //Ну тут всё просто. В абстрактом классе pechat
 //объявлены две функции реализованные в статическом классе
 //pechat_imeni, ничё сложного
 pechat* p= new pechat_treu; 
 p->pechat_imeni();  
 p->pechat_storon();
 delete p; 
 
 
 getchar ();
 
 return 0;
}
Компилим всё это дело так:

Bash
1
2
3
4
5
6
7
8
9
10
11
rem кропаем pechat_treu.o
del pechat_treu.o
g++ -c pechat_treu.cpp
 
rem кропаем main.o
del main.o
g++ -c main.cpp
 
rem кропаем main.exe (линковка)
del main.exe
g++ -o main.exe main.o pechat_treu.o
А теперь изменим хидер pechat_treu.h изменим жёстко. Понапишем туда функций разных, реализуем их в pechat_treu.cpp... НЕ ТРОГАЯ pechat.h. Компилим:

PureBasic
1
2
3
rem кропаем pechat_treu.o
del pechat_treu.o
g++ -c pechat_treu.cpp
А дальше я не знаю. Самый-то главный вопрос- надо ли компилить main.cpp? С одной стороны- конечно надо. Ведь изменённый файл pechat_treu.h подключен к main.cpp. С другой стороны- не надо, ведь с объектом класса pechat_treu мы взаимодействуем исключительно через НЕИЗМЕНЁННЫЙ абстрактный класс. Так надо или не надо перекомпилировать main.cpp?

Кто скажет "надо"- тому сложнее. Ему придётся привести пример того, как изменеения в pechat_treu.h могут повлиять на работу main (). А кто скажет "не надо" должен будет сослаться на источник какой-то, что ли... Противное мнение можно хотя бы примером подкрепить

Не по теме:

Ну и последняя стадия- линковка, тут всё ясно. Самое-то и главный вопрос, повторю, надо ли кропать main.o?


Тут исходные тексты кодов они очень простые. Только лишь для илюстрации этого вопроса и ничего больше.

исходники
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
//main.cpp
#include <windows.h>
#include <stdio.h>
#include "pechat.h"
#include "pechat_treu.h"
 
 
int main() {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 pechat* p= new pechat_treu; 
 p->pechat_imeni();  
 p->pechat_storon();
 delete p; 
 
 getchar ();
 return 0;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
//pechat.h
#ifndef _PECHAT_H
#define _PECHAT_H
class pechat {
 public:
  virtual void pechat_imeni  ()= 0;
  virtual void pechat_storon ()= 0;
};
#endif
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
//pechat_treu.h
#ifndef _PECHAT_TREU_H
#define _PECHAT_TREU_H
#include "pechat.h"
class pechat_treu: public pechat {
 public:
  void pechat_imeni  (); 
  void pechat_storon (); 
};
#endif
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
//pechat_treu.cpp
#include "pechat_treu.h"
#include <stdio.h>
 
void pechat_treu::pechat_imeni  () {printf ("треугольник\n");}; 
void pechat_treu::pechat_storon () {printf ("три стороны\n");};


спасибо, кто откликнется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2013, 16:18
Ответы с готовыми решениями:

Не меняется картинка image в форме, один раз меняется, потом нет
Не меняется картинка image в форме, один раз меняется, потом нет. Запускаю из другого потока,...

Название кнопки не меняется или меняется слишком быстро
void __fastcall TForm1::Timer1Timer(TObject *Sender) { Button1-&gt;Caption = &quot;Loading&quot;; ...

Шрифт не меняется на русских буквах, на английских - меняется
Здравствуйте! Проблема с подключением шрифта. Все сделал верно, но при отображение меняется...

Сколько раз меняется знак в данной последовательности чисел? Запомнить номера позиций, в которых меняется знак
Помогите пожалуйста переделать программу. Вот задание для программы :Задан массив. Определить...

1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
10.03.2013, 21:01  [ТС] 2
Короче я щас разбирался со всем этим делом и вот к какому выводу пришёл. Имеем взаимодействие между main и объектом через абстрактный класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//main.cpp
#include <windows.h>
#include <stdio.h>
#include "abstr.h"
#include "stats.h"
 
abstr* p= new stats; 
int main() {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 p->foo_0();  
 p->foo_6();  
 getchar ();
 return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//abstr.h
#ifndef _ABSTR_H
#define _ABSTR_H
class abstr {
 public:
  virtual void foo_3  ()= 0;
  virtual void foo_8  ()= 0;
  virtual void foo_4  ()= 0;
  virtual void foo_2  ()= 0;
  virtual void foo_0  ()= 0;
  virtual void foo_5  ()= 0;
  virtual void foo_9  ()= 0;
  virtual void foo_6  ()= 0;
  virtual void foo_1  ()= 0;
  virtual void foo_7  ()= 0;
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//stats.h
#ifndef _STATS_H
#define _STATS_H
#include "abstr.h"
class stats: public abstr {
 public:
  void foo_6  ();
  void foo_1  ();
  void foo_7  ();
  void foo_2  ();
  void foo_4  ();
  void foo_9  ();
  void foo_3  ();
  void foo_5  ();
  void foo_8  ();
  void foo_0  ();
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//stats.cpp
#include "stats.h"
#include <stdio.h>
 
void stats::foo_2 ()  {printf ("два___\n");};
void stats::foo_0 ()  {printf ("ноль__\n");};
void stats::foo_9 ()  {printf ("девять\n");};
void stats::foo_4 ()  {printf ("четыре\n");};
void stats::foo_1 ()  {printf ("один__\n");};
void stats::foo_3 ()  {printf ("три___\n");};
void stats::foo_6 ()  {printf ("шесть_\n");};
void stats::foo_7 ()  {printf ("семь__\n");};
void stats::foo_5 ()  {printf ("пять__\n");};
void stats::foo_8 ()  {printf ("восемь\n");};
Теперь компилим:
Bash
1
2
3
rem кропаем main.o
del main.o
g++ -c main.cpp
Так вот что я хочу сказать. Вот у нас щас образовался main.o, так вот там вызываемые функции УЖЕ ИДЕНТИФИЦИРОВАНЫ. Не именами, конечно, но смещениями. Первая находится по смещению 10h, вторая по смещению 1Ch. Я смотрел это
Bash
1
nm main.o
И эти смещения фундаментальны, они уже есть и не изменятся. Это смещения от начало какой-то таблицы, чёрт его знает какой, выясним. Но по крайней мере, они соответствуют положениям функций в хидере абстрактного класса. Ага, значит при компиляции мы привязаны к абстрактному классу. Один определённый вывод есть, то есть при измененеии абстрактного класса, надо перекомпилировать и main.o

...Так, а поток компилим
Bash
1
2
3
4
5
6
7
rem кропаем stats.o
del stats.o
g++ -c stats.cpp
 
rem кропаем main.exe
del main.exe
g++ -o main.exe main.o stats.o
и порядок тел функций в main.exe будет точно соответствовать положению функций в stats.cpp. Так, а потом я смотрел в отладчике: при работе main.exe программа лезет в таблицу виртуальных функций и по по смещению 10h берёт там адрес функции, которая в перечне функций файла *.cpp будет первой (та, которая выводит ноль).
; потом такое же поведение при поиске функции по смещению 1Ch- она в таблице по этому смещению берёт адрес функции, которая 6-я (выводит шесть)

Таким образом я определил, что связующее звено между main.exe и реализацией объекта это хидер абстрактного класса. А хидер объекта может меняться сколько угодно- он влияет на результаты линковки только опосредованно, через хидер абстрактного класса.

Ну вот и всё, разобрался я с этим. Вот кому интересно, тут похожая тема (но не идентичная) тема c законченным выводом:
https://www.cyberforum.ru/com-... 00177.html
и вот ещё факультативно:
Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать?
0
10.03.2013, 21:01
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2013, 21:01
Помогаю со студенческими работами здесь

Меняется ли, или при каких случаях меняется UUID из "Win32_ComputerSystemProduct" (WMI)?
Здравствуйте, уважаемые форумчане Cyberforum. Вопросы таковы: 1) Меняется ли, или при каких...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
В чем отличие между INNER JOIN и OUTER JOIN
bytestream 22.01.2025
В современных базах данных информация часто распределена между множеством взаимосвязанных таблиц, что делает операции объединения JOIN неотъемлемой частью работы с SQL. Эти операции позволяют. . .
Как сделать первую букву заглавной в JavaScript
bytestream 22.01.2025
JavaScript предоставляет разработчикам множество инструментов для эффективной работы с текстовыми данными. Одной из часто встречающихся задач при обработке строк является преобразование первой буквы. . .
Что такое Big O нотация и алгоритмическая сложность
bytestream 22.01.2025
Введение в алгоритмическую сложность В мире разработки программного обеспечения эффективность алгоритмов играет crucial роль в создании качественных приложений. Алгоритмическая сложность. . .
Как решать конфликты слияния (merge) в Git
bytestream 22.01.2025
Конфликты слияния в системе контроля версий Git возникают в ситуациях, когда две или более ветки разработки содержат несовместимые изменения в одних и тех же участках кода. Эти конфликты представляют. . .
Как использовать регулярные выражения
bytestream 22.01.2025
Регулярные выражения представляют собой мощный инструмент для работы с текстовыми данными, который позволяет осуществлять поиск, проверку и манипуляцию строками на основе определенных шаблонов. Этот. . .
Как выйти из Vim
bytestream 22.01.2025
Vim (Vi IMproved) представляет собой один из самых влиятельных текстовых редакторов в истории компьютерной индустрии, эволюционировавший из своего предшественника Vi, созданного Биллом Джоем в 1976. . .
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. ) Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru