小编ran*_*oom的帖子

用原始或智能指针在c ++中组合?

我想做的一个小例子.

我有一个(堆栈分配)顶点的列表

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在运行时会发生变化,而边缘的源和目标顶点可能会变为.

(其中包括进行某种切割和切片)

c++ oop smart-pointers composition

7
推荐指数
1
解决办法
1071
查看次数

Visual Studio中涉及void*,string和const char []的意外重载解析

我使用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生成警告?

c++

4
推荐指数
1
解决办法
675
查看次数

标签 统计

c++ ×2

composition ×1

oop ×1

smart-pointers ×1