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

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

Восстановить пароль Регистрация
 
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 11:48     Не пойму один момент по проектированию #1
Допустим, есть классы А и В.
Файл А.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++ while ( не пойму )
C++ уточните по функции strlen один момент
Слить один два файла в один C++
C++ Не пойму
C++ Подскажите литературу по проектированию С++ программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
19.09.2013, 12:00     Не пойму один момент по проектированию #2
Может быть я и ошибусь так как пока с подобными вещами не сталкивался, однако Лафоре по этому поводу говорит следущее:
Нужно в файле В объявить переменную как extern:
//file A
int var;
//file B
extern int var;
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
19.09.2013, 12:01     Не пойму один момент по проектированию #3
Цитата Сообщение от dimakozyr Посмотреть сообщение
однако файл В.h не может инклудить файл A.h, т.к. тогда получится ошибка, что базовый класс не определен
давайте тут подробнее, потому как по моим понятиям В.h может инклудить A.h.
какой класс вы называете базовым? почему он будет неопределен не пойму
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
19.09.2013, 12:03     Не пойму один момент по проектированию #4
Возможно Вам стоит пересмотреть иерархию классов.
Например определить переменную в базовом классе.
dimakozyr
 Аватар для 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
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
19.09.2013, 12:16     Не пойму один момент по проектированию #6
Если А базовый для B, то, если переменная базового класса int var_A не закрыта, доступ к ней можно получить по имени переменной, если в классе B есть переменная с таким же именем, то чтобы получить доступ к переменной базового класса используйте явное A::var_A
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
19.09.2013, 12:16     Не пойму один момент по проектированию #7
dimakozyr, приведи конкретный пример (код). А вообще подобные вещи получаются при кривом проектировании классов.....
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
19.09.2013, 12:24     Не пойму один момент по проектированию #8
Впринципе можно было бы побеседовать на тему как решить вашу проблему, но соглашусь с Cynacyn пересмотрите структуру классов. Так как то что вы пишите противоречит принципам ООП. Это плохо... это очень плохо. К приватным полям класса должны иметь доступ только методы этого класса или по крайней мере дружественного.
А вообще подобные вещи получаются при кривом проектировании классов.....
Ну собственно и я об этом.
dimakozyr
 Аватар для 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.
 Аватар для 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
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
19.09.2013, 12:51     Не пойму один момент по проектированию #11
C++
1
2
3
4
#include "B.h"
void B::display() {
    /* Допустим, здесь используется var класса А*/
}
ОМГ!
Вот это и есть кривизна в проектировании класса. Класс B не должен ничего "знать" о внутреннем устройстве класса A.
Нужны исключительно веские основания, чтобы поступить иначе. В данном примере я таких оснований не вижу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 13:00     Не пойму один момент по проектированию
Еще ссылки по теме:

C++ Если елементы массива соседние одинаковы то один из них заменяется на 0 а другой увеличиваетмя на один
Подскажите один момент в программе C++
C++ Исключения, объясните один момент

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

Или воспользуйтесь поиском по форуму:
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 13:00  [ТС]     Не пойму один момент по проектированию #12
Ладно, понял, нужно правильно проектировать классы и не искать обходных путей
Yandex
Объявления
19.09.2013, 13:00     Не пойму один момент по проектированию
Ответ Создать тему
Опции темы

Текущее время: 00:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru