Иерархия объектов
Итак, есть в разных файлах классы:
class A {
public:
B ObjectB;
C ObjectC;
};
class B {
...
};
class C {
...
};
Можно ли как либо обратиться к методу ObjectB из метода ObjectC не передавая переменных типа owner и т.п.
Т.к. они находятся в разных файлах, они ваще друг-друга не видят.
Главное инклюды нужные вставлять. А еще можно и использовать друзей. Только дружба даётся а не берётся.
Без разницы классы в разных файлах или нет. Owner(он же this) всегда был есть и поможет.
Главное инклюды нужные вставлять. А еще можно и использовать друзей. Только дружба даётся а не берётся.
Хм. А как? В ObjectC this на него и указывает. А как уровнем выше? Или в его конструктор передавать this от Class A? Ну этот способ я знаю, тока думал может как еще можно...
А еще, можно поподробнее про friend?
Видимо я так и не смог либо объяснить проблему, либо понять ответов :)
Короче, вот что я искал:
В файле с классом нужно писать:
#ifndef _class_h_
#define _class_h_
class A;
#include "classB.h"
#include "classC.h"
class A {
...
}
#endif //_class_h_
И тогда все классы друг о друге знают и дальше уже дело техники.
Зато из форума я понял, что нифига C++ не знаю - пошел читать про дружбу. А чем тут могло помочь наследование - так и не понял :)
Короче, вот что я искал:
В файле с классом нужно писать:
#ifndef _class_h_
#define _class_h_
class A;
#include "classB.h"
#include "classC.h"
class A {
...
}
#endif //_class_h_
Ой неправильно!
Ой огребешь потом...
Лучше сделай объявление класса A в каждом из файлов classB.h и classC.h
а из этого файла объявление перед инклудами убери.
Ой неправильно!
Ой огребешь потом...
Лучше сделай объявление класса A в каждом из файлов classB.h и classC.h
а из этого файла объявление перед инклудами убери.
а что тут можно огрести? просвятите пожалуйста :)
Всем спасибо за помощь!
Видимо я так и не смог либо объяснить проблему, либо понять ответов :)
Короче, вот что я искал:
В файле с классом нужно писать:
#ifndef _class_h_
#define _class_h_
class A;
#include "classB.h"
#include "classC.h"
class A {
...
}
#endif //_class_h_
И тогда все классы друг о друге знают и дальше уже дело техники.
Зато из форума я понял, что нифига C++ не знаю - пошел читать про дружбу. А чем тут могло помочь наследование - так и не понял :)
Это конечно все хорошо, но только как же все-таки
тут обратиться к методу ObjectB из метода ObjectC не передавая переменных типа owner и т.п. ??? Объекты ведь тут не являются статическими членами класса А... Или я чего пропустил?
а что тут можно огрести? просвятите пожалуйста :)
У тебя получается необходимость соблюдения жесткой последовательности подключения заголовочных файлов.
Лучше внести объявление класса A непосредственно в заголовочные файлы, где определяются классы B и C.
У тебя получается необходимость соблюдения жесткой последовательности подключения заголовочных файлов.
Лучше внести объявление класса A непосредственно в заголовочные файлы, где определяются классы B и C.
может лучше сделать такие хейдеры:
#define __CLASSA_
class A
{...};
#endif
#define __CLASSB_
class B
{...};
#endif
#define __CLASSB_
class B
{...};
#endif
как я понимаю, стражи включения обеспечат безбольгую жизнь?
Гварды, конечно вещь крайне нужная и я рекомендую писать их всегда (кстати, у тебя они неправильно написаны), но в данном случае проблема не в гвардах а в использовании имени класса до его определения.
Гварды, конечно вещь крайне нужная и я рекомендую писать их всегда (кстати, у тебя они неправильно написаны), но в данном случае проблема не в гвардах а в использовании имени класса до его определения.
а что неправильно?
а что неправильно?
У тебя:
#define __CLASSA_
#endif
Определяемый макрос у тебя имеет другое имя (на одно подчеркивание вначале больше), чем проверяемый на существование.
Должно быть:
#define _CLASSA_
#endif
У тебя:
#define __CLASSA_
#endif
Определяемый макрос у тебя имеет другое имя (на одно подчеркивание вначале больше), чем проверяемый на существование.
Должно быть:
#define _CLASSA_
#endif
понятно. я думал концептуально неправильно :)
(не надо т.е. реализовывать методы в интерфейсе класса, это вообще плохо)
(не надо т.е. реализовывать методы в интерфейсе класса, это вообще плохо)
ЧЕГО?!
ЧЕГО?!
в .h файле не надо код писать, в class { } не надо код писать, это к тому же, решит проблему. или не так выразился ("интерфейс") ?
в .h файле не надо код писать, в class { } не надо код писать,
Никто не запрещает, ничего не мешает присать реализацию прямо в определении класса.
Правда стоит помнить, что по стандарту, при этом методы считаются inline.
это к тому же, решит проблему.
Нет, это не решит проблему, т.к. проблема не в этом.
или не так выразился ("интерфейс") ?
Ну да, ты видимо имел в виду определение класса.
Никто не запрещает, ничего не мешает присать реализацию прямо в определении класса.
Ну как же. Вот код.
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
Т.е. решение кривое, и мой пост относится к первому посту ветки.
Ну да, ты видимо имел в виду определение класса.
Да, декларацию класса. Интерфесом можно назвать любое формальное определение класса, без деталей его реализации, что не есть декларация. Да, я термин использовал неправильно...
Ну как же. Вот код.
<skip>
Это лишь частный случай и из него не следует делать категоричных обобщенных выводов "в .h файле не надо код писать, в class { } не надо код писать".
Правило простое - определяй класс до его использования. При этом для определения указателя достаточно лишь объявить класс, не определяя его.
Это лишь частный случай и из него не следует делать категоричных обобщенных выводов "в .h файле не надо код писать, в class { } не надо код писать".
Правило простое - определяй класс до его использования. При этом для определения указателя достаточно лишь объявить класс, не определяя его.
Здесь это единственное решение проблемы "но только как же все-таки тут обратиться к методу ObjectB из метода ObjectC", а так же опровержение посту:
Никто не запрещает, ничего не мешает присать реализацию прямо в определении класса.
Кроме того, как Вы уже говорили, реализация методов в описании класса делает их inline, по стандарту, или в крайнем случае COMDEF'ом.
Так что "не писать реализацию в описании класса" - не обобщение. А вот "можно писать реализацию в описании" есть, как раз, частный случай.
елки... :) мне б ваши проблемы... нахрен эти ифдефы писать... есть простая инструкция #pragma once...
старая привычка ;)
а зачем vs 2003, кстати, пишит и то и другое ?
#pragma once
#ifndef _BITSET_
#define _BITSET_
елки... :) мне б ваши проблемы... нахрен эти ифдефы писать... есть простая инструкция #pragma once...
Во-первых, #pragma once нет в стандарте, это расширение от MS.
Во-вторых, иногда требуется не просто раставить гварды, но и иметь возможность отслеживать порядок подключения файлов.