Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> связь между классами ? классы  
:(
    Опции темы
Remiznik
Дата 28.7.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



вот такой вопрос ! 
Есть большой проект и есть главный класс А соответственно А.срр и А.h !Есть подчиненный класс В он создается внутри А , но и у него есть подчиненный класс который создается внутри него С ! вопрос  как при изменение каких-то параметров класса С изменить параметры класса А ?  все классы в отдельных файлах !!!
PM MAIL   Вверх
mes
Дата 28.7.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



используйте предобъявления и будет Вам счастие  smile 

в хидере в таком стиле:
Код


class A; // предобъявление
class B;

class C {
void f(A& a);
void f(B& a);
};
class B {
void f(A& a);
void f(C& a);
};

class A {  // объявление
void f(B& a);
void f(C& a);
};


вся реализация естественно помещается в *.cpp и подключаются нужные хидеры




--------------------
PM MAIL WWW   Вверх
Remiznik
Дата 28.7.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



а где это пред обьявление делать ? у меня есть А.cpp B.cpp и C.cpp  !
PM MAIL   Вверх
mes
Дата 28.7.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Remiznik @  28.7.2008,  21:53 Найти цитируемый пост)
а где это пред обьявление делать ? у меня есть А.cpp B.cpp и C.cpp  !


в А.h B.h или C.h - там где нужно указать что класс будет описан ниже

Добавлено через 7 минут и 21 секунду
Код


// A.h 
class B; 

class A {
  public:
     void Bf (B&); // вызов функции класса B
     void f();
};
// B.h
#include "A.h" // тут инклюд для А, предобъявление делать не надо

class B {
   public:
      void Af (A&);// вызов функции класса A
      void f();
};

//A.cpp
#include "A.h"
#include "B.h"

A::Bf(B& b) {b.f(); }
A::f() {/* ...*/ }

//B.cpp
#include "A.h"
#include "B.h"

B::Af(A& a) {a.f(); }
B::f() {/* ...*/ }



 а вобше эта тема на форуме не раз поднималась .. не забывайте про поиск 


--------------------
PM MAIL WWW   Вверх
Remiznik
Дата 29.7.2008, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



уменя создание обьектов происходит немного не так !

Код

//A.h

#include "B.h"
A::A()          //конструктор класа А 
{ 
        B *b;  //определяем что будет создан обьект класса В
}

//B.h

#include "C.h"
B::B() // конструктор класа В 
{
        C *c; //определяем что будет обьект класа С
}
   


и вот теперь при работе с классом С я хочу изменить какие-то параметры объекта     а  созданного классом А !

а поиск я бы использовал только не знаю как правильно задать запрос ! он относится к области видимости классов ? 
PM MAIL   Вверх
jonie
Дата 29.7.2008, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

Код

...
 B *b;  //определяем что будет создан обьект класса В
...


неверно. вы лишь определили (в этом коде) указатель на B, но сам объект не создали.
как я понимаю вы используете агрегирование. mes дал пример вроде....
Цитата

и вот теперь при работе с классом С я хочу изменить какие-то параметры объекта     а  созданного классом А !
передайте ссылку\указатель на объект типа А в метод класса C (при этом класс С должен знать о классе А)

и обычно распределение по файлам идет не так как у вас. в A.h идет все что связано с А (включая его конструктор) , в Б все что с Б и т.п.
---
разберитесь сначала с двумя классами. потом и третий по аналогии прилепите.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Remiznik
Дата 29.7.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



я вот с передачей ссылки на объект во вложенный класс не очень понимаю как это можно реализовать ? 
PM MAIL   Вверх
mes
Дата 30.7.2008, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Remiznik @  29.7.2008,  21:26 Найти цитируемый пост)
я вот с передачей ссылки на объект во вложенный класс не очень понимаю как это можно реализовать ?  

через функцию(или конструктор) передаете указатель или ссылку и запоминаете ее.



--------------------
PM MAIL WWW   Вверх
Remiznik
Дата 30.7.2008, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



Код

//B.h
#include "A.h"
class B
      B::B(A* h);


так передавать ? я так делал но почему-то объект виден только в нутри конструктора А ...а мне нужно чтоб к нему имел доступ и методы класса B !
PM MAIL   Вверх
mes
Дата 30.7.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250




Цитата(Remiznik @  30.7.2008,  06:25 Найти цитируемый пост)

так передавать ? я так делал но почему-то объект виден только в нутри конструктора А ...а мне нужно чтоб к нему имел доступ и методы класса B ! 


Цитата(mes @  30.7.2008,  02:34 Найти цитируемый пост)
через функцию(или конструктор) передаете указатель или ссылку и запоминаете ее.


Передать передали , а запоминать кто будет ? и остальные методы работают уже с сохраненной ссылкой (указателем)



--------------------
PM MAIL WWW   Вверх
Remiznik
Дата 30.7.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



извини за глупый вопрос но как это сделать так чтоб работать именно с объектом а не сего копией ? 
PM MAIL   Вверх
mes
Дата 31.7.2008, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Remiznik @  30.7.2008,  18:36 Найти цитируемый пост)
извини за глупый вопрос но как это сделать так чтоб работать именно с объектом а не сего копией ?  


Код


class B;
class A
{
   public:
       A(B *p): p_b(p) {}
       void test();

   private:
        B * p_b;
   
};

// A.cpp
void A::test() { p_b->.. ; }


А лучше почитаь книжку про ссылки и указатели. А также неплохо было бы разобраться чем класс отличается от объекта. smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.