Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Иерархия объектов

6.9K
26 августа 2005 года
fightcat
17 / / 07.09.2004
Может быть я неправильно это обозвал, но иначе не придумать...
Итак, есть в разных файлах классы:

class A {
public:
B ObjectB;
C ObjectC;


};

class B {
...
};

class C {
...
};

Можно ли как либо обратиться к методу ObjectB из метода ObjectC не передавая переменных типа owner и т.п.
Т.к. они находятся в разных файлах, они ваще друг-друга не видят.
533
26 августа 2005 года
Visualex
254 / / 07.01.2005
Точно ничего не скажу, но попробуй, "включить" (#include) файлы с классами в базовый, и заранее предопределить объекты, методы и тд.
533
26 августа 2005 года
Visualex
254 / / 07.01.2005
Точно ничего не скажу, но попробуй, "включить" (#include) файлы с классами в базовый, и заранее предопределить объекты, методы и тд.8)
299
26 августа 2005 года
3D Bob
885 / / 18.04.2005
Без разницы классы в разных файлах или нет. Owner(он же this) всегда был есть и поможет.
Главное инклюды нужные вставлять. А еще можно и использовать друзей. Только дружба даётся а не берётся.
6.9K
27 августа 2005 года
fightcat
17 / / 07.09.2004
Цитата:
Originally posted by 3D Bob
Без разницы классы в разных файлах или нет. Owner(он же this) всегда был есть и поможет.
Главное инклюды нужные вставлять. А еще можно и использовать друзей. Только дружба даётся а не берётся.



Хм. А как? В ObjectC this на него и указывает. А как уровнем выше? Или в его конструктор передавать this от Class A? Ну этот способ я знаю, тока думал может как еще можно...
А еще, можно поподробнее про friend?

299
27 августа 2005 года
3D Bob
885 / / 18.04.2005
Кстати а наследование не пробовал использовать?
6.9K
02 сентября 2005 года
fightcat
17 / / 07.09.2004
Всем спасибо за помощь!
Видимо я так и не смог либо объяснить проблему, либо понять ответов :)
Короче, вот что я искал:
В файле с классом нужно писать:

#ifndef _class_h_
#define _class_h_

class A;

#include "classB.h"
#include "classC.h"

class A {
...

}

#endif //_class_h_

И тогда все классы друг о друге знают и дальше уже дело техники.

Зато из форума я понял, что нифига C++ не знаю - пошел читать про дружбу. А чем тут могло помочь наследование - так и не понял :)
3
02 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by fightcat

Короче, вот что я искал:
В файле с классом нужно писать:

#ifndef _class_h_
#define _class_h_

class A;

#include "classB.h"
#include "classC.h"

class A {
...

}

#endif //_class_h_



Ой неправильно!
Ой огребешь потом...

Лучше сделай объявление класса A в каждом из файлов classB.h и classC.h
а из этого файла объявление перед инклудами убери.

1.9K
02 сентября 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by Green
Ой неправильно!
Ой огребешь потом...

Лучше сделай объявление класса A в каждом из файлов classB.h и classC.h
а из этого файла объявление перед инклудами убери.

а что тут можно огрести? просвятите пожалуйста :)

991
07 сентября 2005 года
Zenhipster
157 / / 14.01.2005
Цитата:
Originally posted by fightcat
Всем спасибо за помощь!
Видимо я так и не смог либо объяснить проблему, либо понять ответов :)
Короче, вот что я искал:
В файле с классом нужно писать:

#ifndef _class_h_
#define _class_h_

class A;

#include "classB.h"
#include "classC.h"

class A {
...

}

#endif //_class_h_

И тогда все классы друг о друге знают и дальше уже дело техники.

Зато из форума я понял, что нифига C++ не знаю - пошел читать про дружбу. А чем тут могло помочь наследование - так и не понял :)



Это конечно все хорошо, но только как же все-таки
тут обратиться к методу ObjectB из метода ObjectC не передавая переменных типа owner и т.п. ??? Объекты ведь тут не являются статическими членами класса А... Или я чего пропустил?

3
08 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by solovey
а что тут можно огрести? просвятите пожалуйста :)


У тебя получается необходимость соблюдения жесткой последовательности подключения заголовочных файлов.
Лучше внести объявление класса A непосредственно в заголовочные файлы, где определяются классы B и C.

1.9K
08 сентября 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by Green
У тебя получается необходимость соблюдения жесткой последовательности подключения заголовочных файлов.
Лучше внести объявление класса A непосредственно в заголовочные файлы, где определяются классы B и C.

может лучше сделать такие хейдеры:

 
Код:
#ifndef _CLASSA_
#define __CLASSA_

class A
{...};

#endif


 
Код:
#ifndef _CLASSB_
#define __CLASSB_

class B
{...};

#endif


 
Код:
#ifndef _CLASSB_
#define __CLASSB_

class B
{...};

#endif
как я понимаю, стражи включения обеспечат безбольгую жизнь?
3
08 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by solovey
как я понимаю, стражи включения обеспечат безбольгую жизнь?


Гварды, конечно вещь крайне нужная и я рекомендую писать их всегда (кстати, у тебя они неправильно написаны), но в данном случае проблема не в гвардах а в использовании имени класса до его определения.

1.9K
09 сентября 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by Green
Гварды, конечно вещь крайне нужная и я рекомендую писать их всегда (кстати, у тебя они неправильно написаны), но в данном случае проблема не в гвардах а в использовании имени класса до его определения.

а что неправильно?

3
09 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by solovey
а что неправильно?


У тебя:

 
Код:
#ifndef _CLASSA_
#define __CLASSA_

#endif

Определяемый макрос у тебя имеет другое имя (на одно подчеркивание вначале больше), чем проверяемый на существование.
Должно быть:
 
Код:
#ifndef _CLASSA_
#define _CLASSA_

#endif
1.9K
09 сентября 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by Green
У тебя:
 
Код:
#ifndef _CLASSA_
#define __CLASSA_

#endif

Определяемый макрос у тебя имеет другое имя (на одно подчеркивание вначале больше), чем проверяемый на существование.
Должно быть:
 
Код:
#ifndef _CLASSA_
#define _CLASSA_

#endif

понятно. я думал концептуально неправильно :)

10K
16 сентября 2005 года
vse
38 / / 16.09.2005
ну надо интерфейс в .h а реализацию в .cpp и никаких проблем (и #ifndef __MYFILE оставить)
(не надо т.е. реализовывать методы в интерфейсе класса, это вообще плохо)
3
16 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by vse
(не надо т.е. реализовывать методы в интерфейсе класса, это вообще плохо)


ЧЕГО?!

10K
16 сентября 2005 года
vse
38 / / 16.09.2005
Цитата:
Originally posted by Green
ЧЕГО?!


в .h файле не надо код писать, в class { } не надо код писать, это к тому же, решит проблему. или не так выразился ("интерфейс") ?

3
17 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by vse
в .h файле не надо код писать, в class { } не надо код писать,


Никто не запрещает, ничего не мешает присать реализацию прямо в определении класса.
Правда стоит помнить, что по стандарту, при этом методы считаются inline.

Цитата:
Originally posted by vse

это к тому же, решит проблему.


Нет, это не решит проблему, т.к. проблема не в этом.

Цитата:
Originally posted by vse

или не так выразился ("интерфейс") ?


Ну да, ты видимо имел в виду определение класса.

10K
17 сентября 2005 года
vse
38 / / 16.09.2005
Цитата:
Originally posted by Green
Никто не запрещает, ничего не мешает присать реализацию прямо в определении класса.


Ну как же. Вот код.

class A;
class B;

class B
{
public:
A *ObjectA;
int N() {return ObjectA->M();}
};

class A
{
public:
B *ObjectB;
int M() {return ObjectB->N();}
};


Его не откомпилировать.

А вот код, который работает, и делает то, что задумывалось в первом варианте.


class A;
class B;

class B
{
public:
A *ObjectA;
int N();
};

class A
{
public:
B *ObjectB;
int M();
};


int B::N() {return ObjectA->M();}
int A::M() {return ObjectB->N();}


Цитата:

Нет, это не решит проблему, т.к. проблема не в этом.



Проблема в первом посте решилась довольно быстро, но криво, и появилась следующая проблема:

Цитата:

но только как же все-таки
тут обратиться к методу ObjectB из метода ObjectC


Т.е. решение кривое, и мой пост относится к первому посту ветки.

Цитата:

Ну да, ты видимо имел в виду определение класса.


Да, декларацию класса. Интерфесом можно назвать любое формальное определение класса, без деталей его реализации, что не есть декларация. Да, я термин использовал неправильно...

3
17 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by vse
Ну как же. Вот код.
<skip>


Это лишь частный случай и из него не следует делать категоричных обобщенных выводов "в .h файле не надо код писать, в class { } не надо код писать".
Правило простое - определяй класс до его использования. При этом для определения указателя достаточно лишь объявить класс, не определяя его.

10K
17 сентября 2005 года
vse
38 / / 16.09.2005
Цитата:
Originally posted by Green
Это лишь частный случай и из него не следует делать категоричных обобщенных выводов "в .h файле не надо код писать, в class { } не надо код писать".
Правило простое - определяй класс до его использования. При этом для определения указателя достаточно лишь объявить класс, не определяя его.



Здесь это единственное решение проблемы "но только как же все-таки тут обратиться к методу ObjectB из метода ObjectC", а так же опровержение посту:

Цитата:

Никто не запрещает, ничего не мешает присать реализацию прямо в определении класса.



Кроме того, как Вы уже говорили, реализация методов в описании класса делает их inline, по стандарту, или в крайнем случае COMDEF'ом.

Так что "не писать реализацию в описании класса" - не обобщение. А вот "можно писать реализацию в описании" есть, как раз, частный случай.

351
18 сентября 2005 года
PitxBull
633 / / 22.12.2004
елки... :) мне б ваши проблемы... нахрен эти ифдефы писать... есть простая инструкция #pragma once...
10K
18 сентября 2005 года
vse
38 / / 16.09.2005
Цитата:
Originally posted by PitxBull
елки... :) мне б ваши проблемы... нахрен эти ифдефы писать... есть простая инструкция #pragma once...


старая привычка ;)
а зачем vs 2003, кстати, пишит и то и другое ?
#pragma once
#ifndef _BITSET_
#define _BITSET_

3
18 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by PitxBull
елки... :) мне б ваши проблемы... нахрен эти ифдефы писать... есть простая инструкция #pragma once...



Во-первых, #pragma once нет в стандарте, это расширение от MS.
Во-вторых, иногда требуется не просто раставить гварды, но и иметь возможность отслеживать порядок подключения файлов.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог