Другие языки программирования и технологии

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;
}
Владимир Красников
Владимир Красников
21 360
Лучший ответ
Сначала определить оба класса, потом уже определять методы
пользоваться указателями на класс. Их можно использовать еще до определения класса.
Код не проверял!! !

// =============== Вариант 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 480