正在传递常量指针..我需要做吗

Passing a const pointer... do I need to do it?

本文关键字:指针 常量      更新时间:2023-10-16

我有一个Foo:的结构

struct Foo
{
};

我有一个结构的酒吧:

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传递到构造函数中,然后像传递对结构的引用一样对它们执行某些操作?然后,我在尝试将非常量指针的值设置为常量指针时遇到了问题。

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

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

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; }
};

一切都会编译得很好:foobar指向的FooBarconst,而不是指针本身,这让您可以随心所欲地更改指针。

另一方面,这不会编译:

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成员。