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

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

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

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

19.09.2013, 11:48. Просмотров 480. Ответов 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++
Всем привет, подскажите в строчках в маин 28 и 35 ссылке присваивается объект ? или что происходит. хедр#include <iostream> class...

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

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

Подскажите литературу по проектированию С++ программы - C++
В С++ я разбираюсь не очень хорошо, постепенно занимаюсь осваиванием и столкнулся с тем, что принцип "начинаем писать код, а там разберемся...

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

Если елементы массива соседние одинаковы то один из них заменяется на 0 а другой увеличиваетмя на один - C++
#include "stdafx.h" #include<string> #include <cmath> #include <iostream> #include<locale> using namespace std; const int...

while ( не пойму ) - C++
Сижу уже 1 час и мозги парю, задачу решил вот код : #include "stdafx.h" #include <iostream> #include <conio.h> using namespace...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
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,353
19.09.2013, 12:16     Не пойму один момент по проектированию #7
dimakozyr, приведи конкретный пример (код). А вообще подобные вещи получаются при кривом проектировании классов.....
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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,353
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++
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; int main() { int k; double y,x,e,a,c,b; do{ printf(&quot;Vvedite x...

Не пойму че не так... - C++
Хай чуваки! написал прогу, а она не заходит в одно из условий. Помогите!!! Мне дана матрица коэффициентов системы линейных уравнений в...

Структуру не пойму - C++
Дана информация о студентах.(Фамилия, номер зачетки, оценка экзамена). Вывести список студентов, которые получили 4 и 5. можете...

Как то не пойму - C++
Помогите разобраться.. Не могу понять как написать три программы вроде бы єлементарные. 1. Створити діалогове вікно з двома кнопками,...

не пойму условие.. - C++
здравствуйте, помогите пожалуйста разобрать условие You are given a int A. An integer K is irreducible with respect to A if K cannot...


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

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

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