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

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

Войти
Регистрация
Восстановить пароль
 
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
#1

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

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

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

Я в этой ситуации в файле B.cpp подключаю A.h и получаю переменную с помощью метода getVar(),
правильно-ли это и есть-ли другие пути?
Миниатюры
Не пойму один момент по проектированию  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 11:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не пойму один момент по проектированию (C++):

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

Исключения, объясните один момент - C++
Всем привет, подскажите в строчках в маин 28 и 35 ссылке присваивается объект ? или что происходит. хедр#include <iostream> class...

уточните по функции strlen один момент - C++
Подскажите по функции strlen. int len = strlen(key) функция strlen возвращает длину строки в байтах. допустим если strlen применить...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
19.09.2013, 12:00 #2
Может быть я и ошибусь так как пока с подобными вещами не сталкивался, однако Лафоре по этому поводу говорит следущее:
Нужно в файле В объявить переменную как extern:
//file A
int var;
//file B
extern int var;
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
19.09.2013, 12:01 #3
Цитата Сообщение от dimakozyr Посмотреть сообщение
однако файл В.h не может инклудить файл A.h, т.к. тогда получится ошибка, что базовый класс не определен
давайте тут подробнее, потому как по моим понятиям В.h может инклудить A.h.
какой класс вы называете базовым? почему он будет неопределен не пойму
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
19.09.2013, 12:03 #4
Возможно Вам стоит пересмотреть иерархию классов.
Например определить переменную в базовом классе.
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 12:15  [ТС] #5
Цитата Сообщение от 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: Недопустимый класс хранения для члена класса
};
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
19.09.2013, 12:16 #6
Если А базовый для B, то, если переменная базового класса int var_A не закрыта, доступ к ней можно получить по имени переменной, если в классе B есть переменная с таким же именем, то чтобы получить доступ к переменной базового класса используйте явное A::var_A
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
19.09.2013, 12:16 #7
dimakozyr, приведи конкретный пример (код). А вообще подобные вещи получаются при кривом проектировании классов.....
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
19.09.2013, 12:24 #8
Впринципе можно было бы побеседовать на тему как решить вашу проблему, но соглашусь с Cynacyn пересмотрите структуру классов. Так как то что вы пишите противоречит принципам ООП. Это плохо... это очень плохо. К приватным полям класса должны иметь доступ только методы этого класса или по крайней мере дружественного.
А вообще подобные вещи получаются при кривом проектировании классов.....
Ну собственно и я об этом.
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 12:38  [ТС] #9
Цитата Сообщение от 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 Посмотреть сообщение
А вообще подобные вещи получаются при кривом проектировании классов.....
Никтож не спорит
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.09.2013, 12:43 #10
C++
1
2
3
4
5
#include "B.h"
#include "A.h"
void B::display() {
    /* Допустим, здесь используется var класса А*/
}
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
19.09.2013, 12:51 #11
C++
1
2
3
4
#include "B.h"
void B::display() {
    /* Допустим, здесь используется var класса А*/
}
ОМГ!
Вот это и есть кривизна в проектировании класса. Класс B не должен ничего "знать" о внутреннем устройстве класса A.
Нужны исключительно веские основания, чтобы поступить иначе. В данном примере я таких оснований не вижу.
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 13:00  [ТС] #12
Ладно, понял, нужно правильно проектировать классы и не искать обходных путей
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 13:00
Привет! Вот еще темы с ответами:

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

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

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

Объясните один момент, касающийся переменных - Lisp
Объясните пожалуйста, что такое &amp;optional. Я так понял, это касается перечисления переменных. В учебнике либо плохо искал, либо просто...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.09.2013, 13:00
Ответ Создать тему
Опции темы

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