(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来对对象进行部分操作