将const结构引用转换为非const指针

时间:2014-10-31 12:32:05

标签: c++ pointers struct reference

我正在尝试研究如何将const结构引用转换为非const结构指针。

我有一个名为Foo的结构:

struct Foo
{
    Foo& someFunc()
    {
        //do something

        return *this;
    }
};

我有一个方法:

struct Bar
{
    Foo* fooPointer;

    void anotherFunc(const Foo& foo)
    {
        // set fooPointer to foo's pointer
    }
};

我会这样称呼它:

Foo foo;
Bar bar;
bar.anotherFunc(foo.someFunc());

但是如何编写anotherFunc()?

void anotherFunc(const Foo& foo)
{
    fooPointer = &foo;  // <-- This doesn't work as foo is still const
}

2 个答案:

答案 0 :(得分:5)

最好的答案是“不要那样做,这很疯狂”。如果指针类型不会用于修改对象,则将指针类型更改为const Foo*;如果指针类型将引用,则将其更改为Foo&

如果你真的有充分的理由放弃const-correctness,那么就有一个演员

fooPointer = const_cast<Foo*>(&foo);

但首先要考虑为什么要这样做,以及如何防止以const对象的非const指针结束的错误。或者更糟糕的是,指向一个临时的指针,它会在它消亡后徘徊。

答案 1 :(得分:4)

您可以直接接受它作为Foo的指针或非const引用。

您通过Foo的方式,如果没有const_cast,您将无法做到这一点,除非在一些精确的情况下感觉不对。

当您使用指向非const Foo的指针存储它时,您应该将参数作为非const也使用。考虑一下这个界面:你的struct有一个函数,它带有Foo const限定条件,暗示&#34;我只会在它上面达到峰值&#34;但是然后你的函数转换它并以一种方式存储它允许修改。这有点像对代码的用户撒谎(而且你是代码的第一个用户)。