2014-10-31 2 views
1

Я пытаюсь решить, как преобразовать ссылку на const struct в указатель неконстантной структуры.Преобразование ссылки const struct на неконтинентный указатель

У меня есть-структуру под названием 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

+2

Если вам нужно сохранить указатель на неконстантный объект, передайте неконстантную ссылку, иначе вы просто попрошайничать. –

+0

@ecatmur Для примера это просто так. Я задаю очень конкретный вопрос, не ищу помощь в реструктуризации моего кода. – Beakie

ответ

4

Вы можете принять его непосредственно как указатель или неконстантную ссылку на Foo.

То, как вы передаете свой Foo, вы не сможете этого сделать без const_cast, что кажется неправильным, за исключением нескольких точных фраз.

Поскольку вы храните его с указателем на неконстантный Foo, вы должны взять параметр как неконстантный. Подумайте о интерфейсе: ваша структура имеет функцию, которая принимает Foo с квалификацией const, подразумевая, что «я буду только на ней», но затем ваша функция бросает ее и сохраняет ее таким образом, чтобы она позволяла изменять. Это немного похоже на лжи для пользователей вашего кода (и вы первый пользователь вашего кода).

5

Лучший ответ: «Не делай этого, это сумасшедший». Либо измените тип указателя на const Foo*, если он не будет использоваться для изменения объекта, или ссылка на Foo&, если он будет.

Если вы действительно есть хороший повод, чтобы отбрасывать константный-корректности, то есть литой для этого

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

но сначала рассмотрим, почему вы хотите это сделать, и как вы можете предотвратить ошибку заканчиваясь с указателем non-const для объекта const. Или, что еще хуже, указатель на временное, которое задерживается после его кончины.

+0

Спасибо, Майк. Ваш вход приветствуется ... как всегда. – Beakie

+2

@Beanie: помните, что anotherFunc может вызываться с временным значением. Сохранение указателя на временное - это ожидание. –

Смежные вопросы