C++ 获取对象的内存地址,而不是对象的值
C++ Getting memory addresses of objects instead of the values the object has
遇到了一点麻烦。所以我正在努力模拟十字路口的交通。到目前为止,我有一个车辆类,我进行处理的类,驾驶员以及车辆的两个枚举类(街道和方向)。
从 v.toString() 在 Processor 中的 switch 语句之后:
示例输出:http://gyazo.com/49bb512fc063493e1083d5d4d57ab0d9 [屏幕截图。
编辑1:当有这样的空格时,枚举看起来没问题。
http://gyazo.com/f96d7bb42cab5f3231d5a32d16b9ca82 [截图]
这是我到目前为止所拥有的:
//Direction.h
#ifndef DIRECTION_H
#define DIRECTION_H
enum direction
{
E = 0,
W,
N,
};
#endif
//Street.h
#ifndef STREET_H
#define STREET_H
enum street
{
Main = 0,
Church,
};
#endif
//Processor.h
#ifndef PROCESSOR_H
#define PROCESSOR_H
#include "Vehicle.h"
#include "Street.h"
#include "Direction.h"
class Processor
{
private:
int vCount; //number of cars created
int carTime;
direction tempDirect;
street tempRoad;
int lanes; //What queue its going in
int vNum; // number of vehicle
public:
void createVehicles(int, int);
void Traffic();
};
#endif
//Vehicle.h
#ifndef VEHICLE_H
#define VEHICLE_H
#include "Street.h"
#include "Direction.h"
class Vehicle
{
private:
int vehicleNumber;
int arrivalTime;
int departureTime;
street road;
direction direct;
public:
Vehicle(int, street, direction, int);
Vehicle();
void setVehicleNumber(int);
int getVehicleNumber();
void setArrivalTime(int);
int getArrivalTime();
void setDirection(direction);
direction getDirection();
void setStreet(street);
street getStreet();
void toString();
};
#endif
#include "Vehicle.h"
#include "Street.h"
#include "Direction.h"
#include <iostream>
using namespace std;
Vehicle::Vehicle()
{
}
Vehicle::Vehicle(int vNum, street b , direction a, int aTime)
{
vehicleNumber = vNum;
arrivalTime = aTime;
road = b;
direct = a;
}
void Vehicle::toString()
{
cout<< vehicleNumber << road << direct << arrivalTime << endl;
}
//Processor.cpp
#include "Vehicle.h"
#include "Processor.h"
#include "Street.h"
#include "Direction.h"
#include <stdlib.h> //random
#include <iostream>
#include <ctime> //to reset random seed so not the same number is generated every time
using namespace std;
void Processor::createVehicles(int min, int max)
{
srand(time(NULL));
int count = rand()%(max-min)+min; //how many vehicles will be created
for(int i = 0 ; i < count; i++)
{
lanes = rand() % 6;
switch(lanes)
{
case 0 : tempRoad = Church;
tempDirect = W;
break;
case 1 : tempRoad = Church;
tempDirect = E;
break;
case 2 : tempRoad = Main;
tempDirect = N;
break;
case 3 : tempRoad = Main;
tempDirect = W;
break;
case 4 : tempRoad = Main;
tempDirect = N;
break;
case 5 : tempRoad = Main;
tempDirect = E;
break;
}
Vehicle v((vNum + 1), tempRoad, tempDirect, carTime);
vNum++;
vCount++;
v.toString();
}
}
//Driver.cpp
using namespace std;
#include "Processor.h"
#include <iostream>
int main()
{
Processor process;
process.createVehicles(8, 12);
return 0;
}
我没有看到你在哪里使用指针或获取变量的地址。 打印变量的地址通常是这样的:
Direction d;
d = S;
cout << (void *)(&d) << endl;
我注意到您正在打印enum
变量。 打印enum
变量时,编译器将打印出枚举标识符的序号或赋值;而不是标识符的名称或文本。
打印enum
标识符名称
打印出enum
标识符名称涉及将enum
值与文本相关联。 两种流行的方法是使用std::map
和查找表。
查找表
创建结构数组并搜索结构:
enum Direction { NORTH, WEST, SOUTH, EAST};
struct Direction_Entry
{
Direction d;
char const * text;
};
char const * Direction_To_String(enum Direction d)
{
static const Direction_Entry dir_table[] =
{
{NORTH, "North"}, {WEST, "West"},
{SOUTH, "South"}, {EAST, "East"},
};
static const unsigned int dir_entries =
sizeof(dir_table) / sizeof(dir_table[0]);
static char const text_unknown_dir[] = "Unknown direction";
unsigned int i = 0U;
char const * name = 0;
for (i = 0U; i < dir_entries; ++dir)
{
if (dir_table[i].d == d)
{
name = dir_table[i].text;
}
}
return name;
}
类似的函数可用于从文本转换为enum
。
使用std::map
std::map
还可用于:
const std::string& Direction_To_String(Direction d)
{
static const std::string unknown_dir = "Unknown Direction";
static std::map<Direction, d> dir_map;
if (dir_map.empty())
{
dir_map[NORTH] = "North"; dir_map[WEST] = "West";
dir_map[SOUTH] = "South"; dir_map[EAST] = "East";
}
const std::map<Direction, d>::const_iterator iter = dir_map.find(d);
if (iter != dir_map.end())
{
return iter->second;
}
return Unknown_Direction;
}
您没有获得内存地址,但您正在获取未初始化的数据。 将输出拆分为toString()
cout<< vehicleNumber << " " << road << " " << direct << " " << arrivalTime << endl
您可以看到每辆车的vehicleNumber
递增 1。 如果它是一个模因地址,则每次的值很可能会更改 4。 它是一些奇怪的数字的原因是你从不给它一个值,所以它变成了变量碰巧驻留的内存位置中的任何内容。arrivalTime
永远不会更改,因为代码中没有任何地方可以更改它,并且出于与vehicleNumber
相同的原因,它也获得了垃圾值。
相关文章:
- 空基优化子对象的地址
- 对象地址是否保证是其类型对齐的倍数
- 更改保留指向其字段的原始指针的对象地址
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 为什么存储对象地址在缓冲区中会导致内存泄漏并删除它们
- 尝试将派生类对象地址分配给基类指针的向量
- 如果类型相同,对象地址必须不同,但如果类型不同,地址可以相同
- 使用对象地址以及方法地址和签名调用C 成员函数
- 将派生的对象地址分配给基础指针和调用击路仪的机制
- 为什么写入临时字符串流对象只打印对象地址
- 依赖静态对象地址安全吗
- 获取引用指向的对象地址
- 传递对象地址时"Address expression must be an lvalue or a function designator"
- 在C++中存储对象地址的数据结构
- 从函数初始化对象地址
- 使用reintepret_cast解释对象地址
- 为什么基类指针总是指向基类,即使它持有派生类对象地址
- 是否可以将堆栈对象地址赋给placement new
- <<运算符重载不起作用;仍在打印对象地址
- 关于返回对象地址的困惑