C++ 获取链表中的元素的指针的方法

 (1)虽然不是一个很好的主意,但有时候就是需要获得链表list中的某个元素的指针该怎么办?比如下面这个例子,想从一个map中反向索引存在map中的对象,一个对象自己知道自己存放在map中的位置,而map中保存了每个位置存放了一个什么对象,但是没有保存存放的是哪个对象。所以为了实现这种从map反向索引到对象的操作,可以把每个对象的地址存放到与map同序的指针数组里面。这样就可以直接从map的序号 直接反向索引到实际的对象啦!

 //myclass.h

#pragma once
class TObject
{
public:
	int Life;
	int posID;
};


class TApple :public TObject
{
public:
	TApple();
	~TApple() {}
public:
	int color;
};

class TCar :public TObject
{
public:
	TCar();
	~TCar() {}
	
public:
	int velocity;
};

//myclass.cpp

#include "myclass.h"
#include <stdlib.h>

TApple::TApple()
{
	Life = rand() % 10;
	color = rand() % 4;
}



TCar::TCar()
{
	Life = rand() % 10+10;
	velocity = rand() % 100 + 100;
}

 

 //mymain.cpp

#include <iostream>
#include<time.h>
#include<list>

#include "myclass.h"

TCar genACar(int id)
{
	TCar acar;
	acar.posID = id;
	return acar;
}

TApple genAApple(int id)
{
	TApple apple;
	apple.posID = id;
	return apple;
}

int main()
{
	int map[10]; //包含10个格子的地图,可以用于存放不同的物体
	std::list<TCar> allCar;
	std::list<TApple> allApple;

	srand((int)time(0));//设置随机数种子
	int arand;
	for (int i = 0; i < 10; ++i)
	{
		arand = rand() % 3;
		switch (arand)
		{
		case 1:
			allCar.push_back(genACar(i));
			break;

		case 2:
			allApple.push_back(genAApple(i));
			break;

		default:
			break;
		}
		map[i] = arand;

	}

	//如何从地图索引对应的对象?

	//根据地图报告存放情况
	for (int i = 0; i < 10; ++i)
	{
		std::cout << "在第 " << i << " 个格子存放了 " << map[i] << std::endl;
	}


	system("pause");
	return 0;
}

 

 如何从地图反向索引到存在其中的对象?解决方法:

myclass.h和myclass.cpp与前面相同

//mymain.cpp更新为

#include <iostream>
#include<time.h>
#include<list>

#include "myclass.h"

#define NMAP 20
TCar genACar(int id)
{
	TCar acar;
	acar.posID = id;
	return acar;
}

TApple genAApple(int id)
{
	TApple apple;
	apple.posID = id;
	return apple;
}

int main()
{
	int map[NMAP]; //包含10个格子的地图,可以用于存放不同的物体
	TObject* objInmap[NMAP] = { nullptr, }; //存放每个格子中对应的对象(指针数组)

	std::list<TCar> allCar;
	std::list<TApple> allApple;
	std::list<TCar>::iterator itcar;
	std::list<TApple>::iterator itapp;

	srand((int)time(0));//设置随机数种子
	int arand;
	for (int i = 0; i < NMAP; ++i)
	{
		arand = rand() % 3;
		switch (arand)
		{
		case 1:
			allCar.push_back(genACar(i));

			//问题是怎样从链表获取到里面的对象的地址呢?
			itcar = allCar.end();
			objInmap[i] = dynamic_cast<TCar*>(&(*(--itcar)));//获取链表中的元素的指针的方法
			std::cout <<"objInmap[i]"<< objInmap[i] << std::endl;
			//objInmap[i] = allCar.end();//错误的
			//objInmap[i] = reinterpret_cast<TCar*>(allCar.end()); //错误的
			break;

		case 2:
			allApple.push_back(genAApple(i));
			objInmap[i] = &(*(--allApple.end()));
			break;

		default:
			break;
		}
		map[i] = arand;

	}

	//如何从地图索引对应的对象?

	//根据地图报告存放情况
	for (int i = 0; i < NMAP; ++i)
	{
		std::cout << "在第 " << i << " 个格子存放了 " << map[i] << std::endl;
		if (objInmap[i]!=nullptr)
			std::cout << "Life=" << objInmap[i]->Life << ",posID=" << objInmap[i]->posID << "." << std::endl;
	}


	system("pause");
	return 0;
}

这里,TCar:public TObject以及TApple:public TObject,就是为了使用TObject* objInmap[]来存放TCar和TApple两种不同的对象

进而可以通过objInmap[i]->Life和objInmap[i]->posID来对对象进行部分操作 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值