【问题标题】:Converting const struct reference to non-const pointer将 const 结构引用转换为非常量指针
【发布时间】:2014-10-31 12:32:05
【问题描述】:

我正在研究如何将 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
}

【问题讨论】:

  • 为什么anotherFunc需要一个const引用?
  • 如果您需要存储指向非常量对象的指针,请传递非常量引用,否则您只是在自找麻烦。
  • @ecatmur 就示例而言,它就是这样做的。我问的是一个非常具体的问题,而不是寻求帮助我重构我的代码。
  • 当代码做了一些愚蠢的事情时,正确的做法是质疑它是否真的需要这样做。
  • 我很感激。我的评论可能被误解了。我的意思是事实上的方式......而不是抱怨的方式。我尝试以非常简洁的方式写问题,因为这样会得到你们更好的回应……但这通常意味着我每次都会收到相同的几个初始问题:-/

标签: c++ pointers struct reference


【解决方案1】:

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

如果你真的有充分的理由放弃 const 正确性,那么就有一个演员表

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

但首先要考虑为什么要这样做,以及如何防止以指向 const 对象的非 const 指针结尾的错误。或者更糟糕的是,指向在其消亡后仍然存在的临时对象的指针。

【讨论】:

  • 谢谢迈克。感谢您的意见......一如既往。
  • @Beanie:记住 anotherFunc 可能会被调用一个临时值。保留指向临时对象的指针是一场等待发生的灾难。
【解决方案2】:

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

您传递Foo 的方式,如果没有const_cast,您将无法做到这一点,除非在某些特定情况下,否则感觉是错误的。

当您使用指向非常量Foo 的指针存储它时,您也应该将参数作为非常量。想想接口:你的结构有一个函数,它接受一个带有 const 限定的Foo,暗示“我只会在它上面达到峰值”,但是你的函数将它转换并以允许修改的方式存储它。这有点像对您的代码的用户撒谎(而您是您的代码的第一个用户)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多