我想做的一个小例子.
我有一个(堆栈分配)顶点的列表
class Vertex {
int id;
double x;
double y;
double z;
};
Run Code Online (Sandbox Code Playgroud)
并想要创建边缘列表
class Edge {
int id;
Vertex * source;
Vertex * target;
};
Run Code Online (Sandbox Code Playgroud)
两个指向其源和目标顶点的指针.
通常我会在这里找一个参考,但我希望能够在运行时更改源或目标顶点,所以我需要某种指针类型.
所以我的问题是:是否有一个智能指针在这里很有用,或者我应该只使用上面的普通指针?
编辑
解决了答案中出现的一些问题:
首先,列表应该拥有顶点,这就是它们在堆栈中的原因.
其次,ID用于其他程序.
它需要一个文件,其中包含所有顶点及其坐标的列表,以及所有边的列表及其两个顶点的ID.
第三,我需要某种指针,因为顶点的id在运行时会发生变化,而边缘的源和目标顶点可能会变为.
(其中包括进行某种切割和切片)
我使用visual studio编译器(在VS2010和VS2012中测试)获得了意外的重载解析行为.
最小的例子:
#include <iostream>
#include <string>
void f(void *)
{
std::cout << "f(void*)\n";
}
void f(const std::string &)
{
std::cout << "f(const std::string &)\n";
}
int main()
{
f("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)
输出:
> f(void *)
Run Code Online (Sandbox Code Playgroud)
预期的Ouptut:
> f(const std::string &)
Run Code Online (Sandbox Code Playgroud)
使用GCC进行编译(使用4.6.3测试)可生成预期输出.
如果我注释掉f()的"const std :: string&"版本,visual studio很乐意在没有任何警告的情况下编译/ W4,而GCC会发出以下错误(如预期的那样):"从'const void*'无效转换为'void*'[-fpermissive]".
有谁知道为什么visual studio以这种方式运行,基本上选择const转换重载转换为std :: string for char []?
有没有办法禁止这种行为,或者至少让VS生成警告?