传递一个const指针......我需要这样做吗?

时间:2014-10-30 16:51:11

标签: c++ pointers struct parameter-passing

我有一个Foo的结构:

struct Foo
{
};

我有一个Bar结构:

struct Bar
{
};

它们由另外两个结构来处理,这些结构维护(添加/删除)每个结构的指针数组:

struct FooContainer
{
    Foo** FooList;

    // add(), remove() etc
};

struct BarContainer
{
    Bar** BarList;

    // add(), remove() etc
};

现在,我想要的是另一个名为Baz的结构,它以(以一对多的方式)将Foo链接到Baz。我不能(由于这里没有解释的原因)通过索引引用它们,它必须是指针/引用。

这样的事情:

struct Baz
{
    Foo* foo;
    Bar* bar;
};

如果我想在Baz中添加一个构造函数来获取这些非常量指针,我该怎么做?

Baz应该允许我改变它指向的Foo和Bar的哪个实例......所以它的指针不想成为const。

我是否将指针作为const传递给构造函数,然后像我传递对结构的引用一样对它们执行某些操作?然后,我遇到了尝试将非const指针的值设置为const指针的问题。

我希望这个问题有道理......

编辑:我应该使用引用而不是指针吗?

1 个答案:

答案 0 :(得分:3)

  

Baz应该允许我更改它指向的Foo和Bar的哪个实例...所以它的指针不想成为const

这是正确的,你不想存储常量指针。但是,它不会阻止您存储指向const的指针,这不是一回事。

这听起来令人困惑,所以这里有一个使用Baz示例的插图:

struct Baz
{
    const Foo* foo;
    const Bar* bar;
    Baz(const Foo* newFoo, const Bar* newBar) : foo(newFoo), bar(newBar) {}
    void setFoo(const Foo* newFoo) { foo = newFoo; }
    void setBar(const Bar* newBar) { bar = newBar; }
};

一切都会好好编译:{{1​​}}和Foo指向的Barfoo bar,而不是const指针本身,让你随意改变指针。

另一方面,这不会编译:

struct Baz
{   // Note how const has moved to the other side of the asterisk
    Foo* const foo;
    Bar* const bar;
    Baz(Foo* newFoo, Bar* newBar) : foo(newFoo), bar(newBar) {}
    void setFoo(Foo* newFoo) { foo = newFoo; } // BROKEN!!!
    void setBar(Bar* newBar) { bar = newBar; } // BROKEN!!! 
};

现在指针,而不是"指针对象",是const,阻止您更改foobar成员。