Другие языки программирования и технологии
C++ Классы
Собственно. Имеется Класс A. Одно из его полей класс B. в B необходимо вызвать метод класса A но как тэо сделать ведь A ещё не определён. class B { y.Method(); // Ясное делон не работает. }; class A { B x; Method(); } y A; Как быть? Спасибо.
Судя по вопросу, вы имеете плохое представление о классах.
Поля (они же - свойства класса, они же - переменные члены класса) - это пременные члены объекта класса. Чтобы пользоваться полями объекта класса нужет объект класса.
Методы (они же - функции-члены класса) - это функции-члены объекта класса. Чтобы ими пользоваться нужет объект класса. Иначе- никак.
class B { };
class A { B b; };
При такой организации совсем неразумно пытаться из класса b вызывать метод класса a. Потому что объект b не знает в состав какого класса от входит, и где этот объект, метод которого нужно вызывать.
Если очень нужно чтобы объект знал своего владельца, то нужно использовать указтель на объект, например так:
class A; // просто декларация типа
class B
{
public:
A *pParent; // указатель на объект-владелец объекта b
B(A *p) : pParent(p) {} // конструктор с параметром
void Method();
};
class A
{
public:
A():b(this) {} // конструктор с инициализацией объекта b
B b;
void Method();
};
void B::Method()
{
pParent->Method();
}
void A::Method()
{
// TODO:
}
А можно использовать вложенные классы, так лучше
class A
{
public:
class B
{
public:
void Method();
} b;
void Method();
};
void A::B::Method()
{
// извлекает смещение поля b относительно объекта A
size_t offset = (size_t)&reinterpret_cast<const char&>(((A*)0)->b);
// получаем указатель на объект-владелец
A *parent = reinterpret_cast<A*>(reinterpret_cast<char*>(this) - offset);
// вызываем метод объекта-владелеца
parent->Method();
}
void A::Method()
{
// TODO;
}
Поля (они же - свойства класса, они же - переменные члены класса) - это пременные члены объекта класса. Чтобы пользоваться полями объекта класса нужет объект класса.
Методы (они же - функции-члены класса) - это функции-члены объекта класса. Чтобы ими пользоваться нужет объект класса. Иначе- никак.
class B { };
class A { B b; };
При такой организации совсем неразумно пытаться из класса b вызывать метод класса a. Потому что объект b не знает в состав какого класса от входит, и где этот объект, метод которого нужно вызывать.
Если очень нужно чтобы объект знал своего владельца, то нужно использовать указтель на объект, например так:
class A; // просто декларация типа
class B
{
public:
A *pParent; // указатель на объект-владелец объекта b
B(A *p) : pParent(p) {} // конструктор с параметром
void Method();
};
class A
{
public:
A():b(this) {} // конструктор с инициализацией объекта b
B b;
void Method();
};
void B::Method()
{
pParent->Method();
}
void A::Method()
{
// TODO:
}
А можно использовать вложенные классы, так лучше
class A
{
public:
class B
{
public:
void Method();
} b;
void Method();
};
void A::B::Method()
{
// извлекает смещение поля b относительно объекта A
size_t offset = (size_t)&reinterpret_cast<const char&>(((A*)0)->b);
// получаем указатель на объект-владелец
A *parent = reinterpret_cast<A*>(reinterpret_cast<char*>(this) - offset);
// вызываем метод объекта-владелеца
parent->Method();
}
void A::Method()
{
// TODO;
}
Сначала определить оба класса, потом уже определять методы
пользоваться указателями на класс. Их можно использовать еще до определения класса.
Код не проверял!! !
// =============== Вариант 1 ===============
class A;
class A {
public:
int vA;
class B {
public:
void reset_vA ( A *pA ){ pA->setA(); }
} oB;
void set_vA() { A = 14; }
};
void main() {
A obA;
A.vA=7777;
A.oB.reset_vA(&obA);
}
// =============== Вариант 2 ===============
//Если первый не заработает
class A;
class A {
public:
int vA;
class B {
public:
void reset_vA ( A *pA );
} oB;
void set_vA() { A = 14; }
};
void B::reset_vA ( A *pA ) { pA->setA(); }
void main() {
A obA;
A.vA=7777;
A.oB.reset_vA(&obA);
}
//======================
Если ничего не заработает, отпишись на мыло, будет время - попробую разобраться. Хотя это изврат. Может с передачей в метод reset_vA указателя на функцию setA? Да, в мыле укажи название и версию среды разработки. Мало-ли
Код не проверял!! !
// =============== Вариант 1 ===============
class A;
class A {
public:
int vA;
class B {
public:
void reset_vA ( A *pA ){ pA->setA(); }
} oB;
void set_vA() { A = 14; }
};
void main() {
A obA;
A.vA=7777;
A.oB.reset_vA(&obA);
}
// =============== Вариант 2 ===============
//Если первый не заработает
class A;
class A {
public:
int vA;
class B {
public:
void reset_vA ( A *pA );
} oB;
void set_vA() { A = 14; }
};
void B::reset_vA ( A *pA ) { pA->setA(); }
void main() {
A obA;
A.vA=7777;
A.oB.reset_vA(&obA);
}
//======================
Если ничего не заработает, отпишись на мыло, будет время - попробую разобраться. Хотя это изврат. Может с передачей в метод reset_vA указателя на функцию setA? Да, в мыле укажи название и версию среды разработки. Мало-ли
Похожие вопросы
- Есть ли ошибка? Может ли возникнуть? И вообще приемлимо ли? C++ классы
- C++ Классы и Переменные
- C++ классы и структуры
- C++. Классы.
- visual c++(form project) подскажите где там можно создать и описать свой класс? что то не выходит ((
- Абстрактные классы в c#
- Доступ к полям другого класса. C# Подробно внутри!
- проясните по классу в c++ по книге.
- Как в C# инициализировать массив в свойстве класса?
- Создать класс типа круг. C++