2014-10-31 75 views
1

我想了解如何将const结构引用转换为非const结构指针。将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 
} 
+1

为什么'anotherFunc'需要一个const引用? – ecatmur 2014-10-31 12:34:19

+2

如果你需要存储一个指向非const对象的指针,传递一个非const引用,否则你只是乞求麻烦。 – 2014-10-31 12:37:23

+0

@ecatmur为了这个例子,它只是做。我正在问一个非常具体的问题,而不是寻求重组我的代码的帮助。 – Beakie 2014-10-31 12:39:50

回答

4

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

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

正如你用一个指向非const的指针Foo来存储它,你也应该把这个参数当作非常量。考虑一下接口:你的结构函数需要一个带有const限定符的Foo函数,意味着“我只会在它达到峰值”,但是你的函数会抛出它并以允许修改的方式存储它。这有点像对你的代码的用户撒谎(你是你的代码的第一个用户)。

5

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

如果你真的有一个很好的理由抛弃常量,正确性,然后有针对

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

但首先投考虑你为什么要做到这一点,你可以如何防止结束了的错误带有一个指向const对象的非const指针。或者更糟糕的是,一个指向临终的指针会在其消亡后徘徊。

+0

谢谢迈克。赞赏你的意见......一如既往。 – Beakie 2014-10-31 12:40:46

+2

@Beanie:记住anotherFunc可能会被临时调用。保留一个临时指针是一个等待发生的灾难。 – 2014-10-31 12:53:33

相关问题