使用C++构建最简单的动态类型系统

为了说明动态类型系统和静态类型系统之间的差异和联系,这里简单叙述一下如何使用静态类型系统来构建动态类型系统。这个任务类似于为一门新的语言设计类型系统。所以如果你发现这个动态类型系统类似于你使用过的任何OO系统,请原谅我。应为所有的动态类型系统都是类似的,而且其背后的机理完全相同,只是实现上的差异而已。

 

先列出OO的核心技术,这样在我们设计的时候可以时刻对比我们是不是在这样做。

* 使用类来表达概念

* 使用消息在类之间传递信息

 

我们动态类型系统的期望目标很简单,那就是可以动态添加成员和方法。有了这个,我们就可以实现几乎所有的动态系统的特性了,如不特定消息发送,避免虚函数调用的开销,更简单的函数覆盖实现等等。

 

动态的类型系统,那就意味着运行时我们有一切的类型信息。所有我们需要把类型信息以合适的方式存储起来。在C++中,基础的类型就有十几种,更不要说用户创建的更多类型了。怎么办呢?简单想一下,就明白,我们只要一简单的字符串表达类型即可。不是使用字符串本身的类型,而是使用字符串对象的内容,不同的内容表示不同的类型即可。于是,我们可以说,对象Foo有如下的成员,其类型为“double”,其名字为weight,其值为94.5。可以看到,我们需要三个不同维度的东西来表达一个成员。C++中之需要两个就可以了,类型信息是静态的,编译期会处理。所以,这里的核心是:把类型信息表达为数据。

 

另一方面,C++成员的名字的硬编码的,在执行的时候,这些名字已经被地址替代了。这不是我们想要的,所以,我们要进一步把成员

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一个简单的校园导航系统可以通过以下步骤用C++实现: 1. 定义节点和边的结构体 首先,我们需要定义一个节点的结构体,用于存储节点的信息,例如节点的名称、位置等。同时,我们还需要定义一个边的结构体,用于存储两个节点之间的距离或时间等信息。 ```c++ struct Node { string name; // 节点名称 int x; // 节点横坐标 int y; // 节点纵坐标 }; struct Edge { int from; // 起点编号 int to; // 终点编号 int weight; // 边的权值 }; ``` 2. 构建图 接下来,我们可以将节点和边组合成一个图。我们可以使用邻接矩阵来存储图的信息,也可以使用邻接表来存储图的信息。这里我们使用邻接矩阵来存储图的信息。 ```c++ const int MAX_NODE = 100; // 最大节点数 int g[MAX_NODE][MAX_NODE]; // 邻接矩阵 int n; // 节点数 int m; // 边数 ``` 3. 实现校园导航功能 校园导航系统的主要功能是查询两个节点之间的最短路径。我们可以使用Dijkstra算法来实现最短路径查询。 ```c++ const int INF = 0x3f3f3f3f; // 无穷大 int dist[MAX_NODE]; // 起点到各个节点的最短距离 bool visited[MAX_NODE]; // 记录节点是否已经访问 void dijkstra(int s) { memset(dist, INF, sizeof(dist)); memset(visited, false, sizeof(visited)); dist[s] = 0; for (int i = 0; i < n; i++) { int u = -1; for (int j = 0; j < n; j++) { if (!visited[j] && (u == -1 || dist[j] < dist[u])) { u = j; } } visited[u] = true; for (int v = 0; v < n; v++) { if (!visited[v] && g[u][v] != INF && dist[u] + g[u][v] < dist[v]) { dist[v] = dist[u] + g[u][v]; } } } } ``` 4. 完整代码 ```c++ #include <iostream> #include <cstring> #include <string> using namespace std; const int MAX_NODE = 100; // 最大节点数 const int INF = 0x3f3f3f3f; // 无穷大 struct Node { string name; // 节点名称 int x; // 节点横坐标 int y; // 节点纵坐标 }; struct Edge { int from; // 起点编号 int to; // 终点编号 int weight; // 边的权值 }; int g[MAX_NODE][MAX_NODE]; // 邻接矩阵 int n; // 节点数 int m; // 边数 Node nodes[MAX_NODE]; // 存储节点的信息 bool visited[MAX_NODE]; // 记录节点是否已经访问 int dist[MAX_NODE]; // 起点到各个节点的最短距离 // Dijkstra算法求最短路径 void dijkstra(int s) { memset(dist, INF, sizeof(dist)); memset(visited, false, sizeof(visited)); dist[s] = 0; for (int i = 0; i < n; i++) { int u = -1; for (int j = 0; j < n; j++) { if (!visited[j] && (u == -1 || dist[j] < dist[u])) { u = j; } } visited[u] = true; for (int v = 0; v < n; v++) { if (!visited[v] && g[u][v] != INF && dist[u] + g[u][v] < dist[v]) { dist[v] = dist[u] + g[u][v]; } } } } int main() { cout << "请输入节点数和边数:" << endl; cin >> n >> m; memset(g, INF, sizeof(g)); for (int i = 0; i < n; i++) { cout << "请输入节点" << i << "的名称、横坐标和纵坐标:" << endl; cin >> nodes[i].name >> nodes[i].x >> nodes[i].y; } for (int i = 0; i < m; i++) { int u, v, w; cout << "请输入边" << i << "的起点、终点和长度:" << endl; cin >> u >> v >> w; g[u][v] = g[v][u] = w; } cout << "请输入起点和终点的编号:" << endl; int s, t; cin >> s >> t; dijkstra(s); cout << "从" << nodes[s].name << "到" << nodes[t].name << "的最短路径长度为:" << dist[t] << endl; return 0; } ``` 在上面的代码中,我们先输入节点数和边数,然后依次输入每个节点的名称、横坐标和纵坐标,以及每条边的起点、终点和长度。接着,输入起点和终点的编号,然后调用dijkstra函数求最短路径。最后输出从起点到终点的最短路径长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值