Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для dimakozyr
167 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560

Не пойму один момент по проектированию

19.09.2013, 11:48. Показов 2207. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим, есть классы А и В.
Файл А.h инклудит файл B.h.
Но в классе А есть переменная, которая нужна классу В, однако файл В.h не может инклудить файл A.h, т.к. тогда получится ошибка, что базовый класс не определен.

Я в этой ситуации в файле B.cpp подключаю A.h и получаю переменную с помощью метода getVar(),
правильно-ли это и есть-ли другие пути?
Миниатюры
Не пойму один момент по проектированию  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2013, 11:48
Ответы с готовыми решениями:

Не пойму момент (обработка исключений)
Вот код: try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } ...

Не пойму - как добавить еще один метод
Здравствуйте. Помогите пожалуйста с такой задачей: Есть готовая рабочая программа: unit polimor_; interface uses ...

Не получается один момент
Сделала я листинг макроса, но не получается выполнить последнее задание - найти склад с наименьшим значением объема перевозок. Подскажите,...

11
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
19.09.2013, 12:00
Может быть я и ошибусь так как пока с подобными вещами не сталкивался, однако Лафоре по этому поводу говорит следущее:
Нужно в файле В объявить переменную как extern:
//file A
int var;
//file B
extern int var;
2
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
19.09.2013, 12:01
Цитата Сообщение от dimakozyr Посмотреть сообщение
однако файл В.h не может инклудить файл A.h, т.к. тогда получится ошибка, что базовый класс не определен
давайте тут подробнее, потому как по моим понятиям В.h может инклудить A.h.
какой класс вы называете базовым? почему он будет неопределен не пойму
1
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
19.09.2013, 12:03
Возможно Вам стоит пересмотреть иерархию классов.
Например определить переменную в базовом классе.
1
 Аватар для dimakozyr
167 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
19.09.2013, 12:15  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Нужно в файле В объявить переменную как extern:
//file A
int var;
//file B
extern int var;
Если так объявить переменную внутри класса, то extern подчеркивается красным и пишет "Error: Недопустимый класс хранения для члена класса"

Цитата Сообщение от AntonChik Посмотреть сообщение
какой класс вы называете базовым? почему он будет неопределен не пойму
Базовый в данном случае A. Если В включит А, то получится, что они включают друг друга и компилятор
ошибку выдаст, что базовый класс не определен.

Цитата Сообщение от Cynacyn Посмотреть сообщение
Например определить переменную в базовом классе.
Да, но бывает, что если так делать, количество классов неоправданно возрастет в разы

Добавлено через 3 минуты
Насчет extern:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class A {
  public:
      A() : var(0) {}
      void getVar();
  private:
      int var;
};
 
class B {
  public:
        void display()
        { /* используем var */ }
  private:
      extern int var;       // Error: Недопустимый класс хранения для члена класса
};
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
19.09.2013, 12:16
Если А базовый для B, то, если переменная базового класса int var_A не закрыта, доступ к ней можно получить по имени переменной, если в классе B есть переменная с таким же именем, то чтобы получить доступ к переменной базового класса используйте явное A::var_A
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
19.09.2013, 12:16
dimakozyr, приведи конкретный пример (код). А вообще подобные вещи получаются при кривом проектировании классов.....
2
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
19.09.2013, 12:24
Впринципе можно было бы побеседовать на тему как решить вашу проблему, но соглашусь с Cynacyn пересмотрите структуру классов. Так как то что вы пишите противоречит принципам ООП. Это плохо... это очень плохо. К приватным полям класса должны иметь доступ только методы этого класса или по крайней мере дружественного.
А вообще подобные вещи получаются при кривом проектировании классов.....
Ну собственно и я об этом.
1
 Аватар для dimakozyr
167 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
19.09.2013, 12:38  [ТС]
Цитата Сообщение от CheshireCat Посмотреть сообщение
приведи конкретный пример (код)
// A.h
C++
1
2
3
4
5
6
7
8
9
10
#include "B.h"
class A {
  public:
      B objB;
      A() : var(0) {}
      int getVar() { return var; }
      void method();
  private:
      int var;  // к ней мы хотим получит доступ из В
};
// A.cpp
C++
1
2
3
4
#include "A.h"
void method() {
    objB.display();
}
// B.h
C++
1
2
3
4
class B {
  public:
        void display();
};
// B.cpp
C++
1
2
3
4
#include "B.h"
void B::display() {
    /* Допустим, здесь используется var класса А*/
}
// main.cpp
C++
1
2
3
4
5
6
#include "A.h"
int main() {
    A objA;
    objA.method();
    return 0;
}
Цитата Сообщение от CheshireCat Посмотреть сообщение
А вообще подобные вещи получаются при кривом проектировании классов.....
Никтож не спорит
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
19.09.2013, 12:43
C++
1
2
3
4
5
#include "B.h"
#include "A.h"
void B::display() {
    /* Допустим, здесь используется var класса А*/
}
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
19.09.2013, 12:51
C++
1
2
3
4
#include "B.h"
void B::display() {
    /* Допустим, здесь используется var класса А*/
}
ОМГ!
Вот это и есть кривизна в проектировании класса. Класс B не должен ничего "знать" о внутреннем устройстве класса A.
Нужны исключительно веские основания, чтобы поступить иначе. В данном примере я таких оснований не вижу.
2
 Аватар для dimakozyr
167 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
19.09.2013, 13:00  [ТС]
Ладно, понял, нужно правильно проектировать классы и не искать обходных путей
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2013, 13:00
Помогаю со студенческими работами здесь

Исключения, объясните один момент
Всем привет, подскажите в строчках в маин 28 и 35 ссылке присваивается объект ? или что происходит. хедр#include &lt;iostream&gt; ...

Объясните один момент в функции
Только начинаю изучать JS и не могу понять зачем в данном уравнении функция возвращает -1. Что это даёт и просьба не бросаться тапками. :) ...

Проясните один момент с оператором !==
Есть такой вот код: var view = { displayMessage: function(msg) { var messageArea = document.getElementById(&quot;messageArea&quot;); ...

Обьясните пожалуйста один момент
public class ЛогическийТипДанных { public static void main (String agrs){ boolean b; b=false; ...

Подскажите один момент в программе
Код не мой, по этому не могу понять одну деталь,программа-калькулятор #define _CRT_SECURE_NO_WARNINGS #include &lt;stdio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru