【问题标题】:Passing a const pointer... do I need to do it?传递一个 const 指针......我需要这样做吗?
【发布时间】:2014-12-26 20:07:06
【问题描述】:

我有一个 Foo 结构:

struct Foo
{
};

我有一个 Bar 的结构:

struct Bar
{
};

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

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 指针时遇到问题。

我希望这个问题有意义...

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

【问题讨论】:

    标签: c++ pointers struct parameter-passing


    【解决方案1】:

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

    现在指针,而不是“pointee”,是const,阻止您更改foobar 成员。

    【讨论】:

    • 这就是我的想法。为什么在传递对结构的引用时,将其作为 const 引用传递?
    • @Beakie 如果您希望能够更改您的struct,则不必将其作为const 引用传递。当您不想更改它时,您可以使用 const 为调用者在调用您的函数时提供很大的灵活性,因为通过 const 引用 struct 可以让调用者传递一个临时的。例如,如果你有void foo(const Baz& b),你可以这样称呼它:foo(Baz(p1, p2))。在这里,Baz 是一个临时对象,但没关系,因为foo 通过const 引用了Baz。如果没有const,同样的调用将无法编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多