Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2009, 01:11   #1
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию Как в базовом классе описать указатель на объект производного класса?

Как в базовом классе описать указатель на производный класс?

Вот пример написал.

Код:
#include <stdio.h>

class Base{
int x;
A *powner; // выдаёт "синтаксическая ошибка: отсутствие ";" перед "*""
public:
Base(){powner=&this};
void set() {x=powner->x; printf("X= %d\n",x);};
}

class A: private Base{
public: 
int x;
void set(int a) {x=a};
}

void main()
{   
A *obj=new(A);
obj->set(100);
obj->Base::set();

delete(obj);
}

Последний раз редактировалось MasterGH; 16.11.2009 в 01:30. Причина: Другая формулировка вопроса
MasterGH вне форума Ответить с цитированием
Старый 16.11.2009, 01:29   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Уж извините, но слегка извращённые у вас примеры)) Каков смысл в базовом классе, когда он привязан к конкретному производному?) Может я не в курсе некоторых деталей и на деле это всё часть Великого Замысла, но всё же...)
По теме: Таким способом обратится нельзя, создавать объект класса можно только после его декларации. В данном случае можно воспользоваться шаблонами, чтобы сделать так как Вам надо.
Ещё одно замечание: this - это указатель, он имеет тип Base* const, то есть брать его адрес не надо
Код:
#include <stdio.h>

template<class T>
class Base{
int x;
T * powner; // выдаёт "синтаксическая ошибка: отсутствие ";" перед "*""
public:
Base(){ powner = static_cast<A*>(this);};
void set() {x=powner->x; printf("X= %d\n",x);}
};

class A: public Base<A>{
public: 
int x;
void set(int a) {x=a;};
};

void main()
{   
A *obj=new(A);
obj->set(100);
obj->Base::set();

delete(obj);
}
netrino вне форума Ответить с цитированием
Старый 16.11.2009, 01:46   #3
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию

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

Пример весьма прост - в базовом классе надо вывести информацию о том какой игрок в данный момент стрелял и перезаряжался.

проблемные места я отметил в комментариях знаками !!!!

Код:
#include <stdio.h>


class Weapon{
	int ID,Allammo,MagzAmmo,Ammo;
public:
	void Shot()
	{
		printf("Player %d Shot!\n",Player::ID); //!!!! кто стрелял из производного класса?
		--Ammo; 
		if (Ammo<=0) Reload(); 
	};
	void Set(int id,int allammo,int mammo)
	{ID=id; 
	Allammo=allammo; 
	MagzAmmo=mammo; 
	Ammo=0; 
	Reload();};
	void Reload(){
				if (Ammo>MagzAmmo) return; 
				int decrease;	
				if (Allammo>MagzAmmo)
						{
						  decrease=MagzAmmo-Ammo; 
						  Ammo+=decrease; 
						  Allammo-=decrease;
						}
				else {Ammo=Allammo; Allammo=0;};
				printf("PlayerID= %d Reload!\n",Player::ID); //!!!! кто перезаряжался из производного класса?
				printf("Ammo= %d\n",Ammo); 
				printf("Allammo= %d\n",Allammo); };
	
	void GetInfo(){
				printf("WeaponID= %d\n",ID);
				printf("Allammo= %d\n",Allammo);
				printf("MagzAmmo= %d\n",MagzAmmo);
				printf("Ammo= %d\n\n",Ammo);};  
};
class Player: private Weapon{
	
public:
	int ID,Health;
	void Sett(int id, int health){ID=id; Health=health;}
	void GetInfo(){
		printf("PlayerID= %d\n",ID);
		printf("Health= %d\n",Health);
		Weapon::GetInfo();}
};

void main()
{   
	Player *obj1=new(Player);
	Player *obj2=new(Player);

	obj1->Player::Set(1,200);
	obj1->Weapon::Set(1,30,5);
	obj1->Player::GetInfo();

	obj2->Player::Set(2,100);
	obj2->Weapon::Set(1,30,5);
	obj2->Player::GetInfo();

	for (int i=1;i<=13;i++){obj1->Shot(); obj2->Shot();}

	delete(obj2);
	delete(obj1);
};

Последний раз редактировалось MasterGH; 16.11.2009 в 01:50.
MasterGH вне форума Ответить с цитированием
Старый 16.11.2009, 02:55   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Хмм... На мой взгляд тут немного не правильно разделены сущности.
Как говорится, убивает не оружие, убивают люди
То есть класс Оружие не должен знать ничего о том, кто из него стреляет, подобные ф-ции, ИМХО, должны быть возложены на класс Игрок. Более того, наследование Игрока от Оружия тоже несколько смущает, скорее у класса Игрок должно быть поле типа Оружие, такое же, как, например, поле типа Защита, Рюкзак или ещё что угодно. Я это всё к тому, что вряд ли кто-то проектирует такую иерархию классов на практике ) хотя всяко быть может, сам я играми не занимался, потому в этой области не очень =)
Вообще говоря я встречал и сам использовал такой способ получения информации в базовом классе из производного, но это были либо адреса статических ф-ций, либо значения перечислений, то есть они не были привязаны к конкретному объекту, обычно можно обойтись без этого, например введением поля в protected секции, которое и будет заполнять производный класс.
Код:
class Base {
protected:
    int DerivateID;
public:
    void show() { 
        printf("Derivate ID: %d", DerivateID);
        
        return;
    }
};

class Derivate : public Base {
public:
    Derivate() {
        DerivateID = 1;
    }
};

int main()
{
    Derivate* obj = new Derivate;

    obj->show();

    return 0;
}
Идея, думаю, понятна )
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54
арифметика класса + объект this Nitrino Общие вопросы C/C++ 4 19.10.2009 21:00
Как узнать, создавался ли уже объект класса? TwiX Общие вопросы Delphi 4 06.10.2009 09:44
объект класса TBItmap albatros Мультимедиа в Delphi 3 27.03.2009 16:23
как использовать указатель this z3rg Общие вопросы C/C++ 2 16.03.2009 23:28