2013-04-02 2 views
0

Я хочу скопировать значение константного примитивного типа и присвоить ссылку. Я хочу сделать это, чтобы сделать это в куче, это возможно?как я могу сделать копию примитивных типов C++?

сделать некоторые вещи, как это:

const unsigned long rawnan[2]={0xffffffff, 0x7fffffff}; 
const double NaN = *(double*)rawnan; 
    Class{ 
     float &_f; 
     inline Class():_f(float(NaN)){ 
     } 
    } 

, и я хочу знать, если когда:

Class{ 
    float &_f; 
    inline Class(float F):_f(float(F)){ 
    } 
} 

, если я на самом деле сделать копию переменной F или нет (я знаю, что мог ссылаясь непосредственно на F, но я думаю, что его объем закончится в конце конструктора, тогда мне нужно будет сделать копию его значения.)

(если код не компилируется, это потому, что это псевдокод из реальное сотрудничество де, то фундамент вопрос является важным, я надеюсь, понятно)

(я делаю deffinition Нан так, потому что это лучший способ до сих пор я знаю, чтобы сделать это и быть совместимы с VC++ и G ++)

+2

Это псевдокод, вы должны привести пример с реальным кодом. – iammilind

+0

В чем проблема, которую вы пытаетесь решить? – tjameson

+0

Вы, кажется, смешиваете «double» и «float» в своем примере. Вы хотите инициализировать константу двоичному значению «float» NaN или «double» NaN? –

ответ

1

Вот как:

float first = 3.14159265358979324f; 
float second = first; 
+0

Во-первых, это не значение const, во-вторых, я могу сделать это на конструкторе, как это сделано в примере: –

+0

@ user1739342 Вы также можете написать код в теле конструктора. Просто присвойте свой аргумент переменной-члену. – 2013-04-02 10:14:49

+0

Но это ссылка, когда тело вызывает _f, должно что-то ссылаться. Поэтому я должен связать его, чтобы дать ссылку, и я не хочу делать это с помощью нового –

1

Ни один из ваших фрагментов кода является правильным.

float(NaN) и float(F) являются временными объектами. Вы привязываете их к элементу ссылочных данных _f, но это не продлевает их срок службы. Итак, к тому времени, когда вы приступите к использованию ссылки _f, она будет свисать.

Если вы хотите взять копию float, используйте элемент данных float, а не float&. Если вам нужен ссылочный элемент данных, вы должны убедиться, что он ссылается на то, что будет существовать при использовании ссылки.

если код не компилируется, это потому, что это псевдо-код от реального кода

Правильный способ справиться с этим, чтобы написать короткую полную программу, включая код, который вы хотите спросить, проверить, что он компилируется, а затем задать вопрос о вашей полной программе. Существует не менее двух компиляционных проблем с кодом, который вы опубликовали. Ваш реальный код (если он компилируется в g ++) не может инициализировать ссылку так, как вы делали в своем примере кода.

+0

Спасибо за ваш ответ, но если бы я мог сделать float insted float, и я бы это сделал. Я думаю, что этот вопрос отражает проблему, и я знаю, что этот float (NaN) не компилируется. Я знаю, что связывает временные значения, которые уже написаны в вопросе, и это моя проблема. Я просто хочу знать, есть ли способ или нет. –

+0

@ user1739342: если вам нужна копия, и вам также нужна ссылка, вы можете использовать два элемента данных. 'struct Foo {float fval; float &fref; Foo (float f): fval (f), fref (fval) {}}; '. Но я действительно не вижу смысла - если вы возьмете копию, вы можете просто использовать копию, я не могу думать, почему вам также понадобится элемент ссылочных данных, который ссылается на копию. Поскольку вы не укажете использование этой ссылки, вы не получите никаких советов по этому поводу. –

+0

сложно. Я являюсь критерием присущности, я хочу, чтобы дочерний класс указывал на то же место, что и его отец. Это означает, что когда конструктор дочернего класса, использующий объект класса отца, внутренние значения должны указывать на одни и те же местоположения. Поскольку я хочу, чтобы объект-объект был изменен, это изменение объекта для детей. Я хочу сделать это без изменений в реализации класса отца. –

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