2009-03-27 2 views
0

Im пытается сделать копию часть «глубокой копии» с моей копией конструктора:Конструктор копирования

class myClass 
{ 
public: 

    myClass (const char *cPtr, const float fValue) 
    myClass (const myClass& myClassT); 

private: 

    const char* &myAddress; 
    float MyFloater; 

}; 

//myClass.cpp 

myClass::myClass(const char *cPtr, const float fValue) 
{ 
// Initialize both private varaible types 
    const char* &myAddress = cPtr; 
    float myFloater = fValue; 
} 

myClass::myClass(const myClass& classType) 
{ 
// copy what we did ... 
     myAddress = myClass.myAddress; 
     myFloater = myClass.myFloater; 
} 

с только что, им получать только, «необходимо инициализировать whataver Название переменной в базе/член initalizer списка .

Они initalized в конструкторе что мне нужно сделать с адресом объекта ClassType

+0

В вашем объявлении класса есть ваш MyFloater частный член, но в определении используется myFloater? Также вы должны решить, какой стиль кодирования вы используете и быть совместимым с ним. Например, я пишу типы с первой заглавной буквой и именами переменных с более низкой буквой. –

ответ

3

Несколько проблем:!?

1) Почему вы повторяете объявление переменной в первом конструкторе?

2) Почему вы объявляете myAddress ссылкой, а не как указатель? Ссылка всегда должна быть инициализирована в списке инициализации конструктора. Вероятно, это является причиной вашего сообщения об ошибке. Инициализация в корпусе конструктора неприемлема для C++.

Во втором конструкторе, вы, вероятно, хотите что-то вроде:

myClass::myClass(const myClass& classType):myAddresss(classType.myAddress), myFloater(classType.myFloater) 
{ 
} 

Причина этого должен сделать с тем, как строятся объекты. В точке, где выполняется тело конструктора, объект уже считается «встроенным», поэтому ссылки уже должны быть действительными, поэтому ваше назначение ссылки отклоняется с помощью C++.

И, кстати, это не очень глубокая копия ...

7
const char* &myAddress; 

является ссылкой, поэтому он должен быть инициализирован в списке инициализации во время конструктора, т.е.

myClass::myClass(const char *& cPtr, const float fValue): myAddress(cPtr) 

Обратите внимание, что это плохой способ справиться с этой ситуацией (конечно, в зависимости от того, что вы пытаетесь сделать), так как если указатель прошел, то вы ввернуты.

Лучший способ сделать это (опять же, в зависимости от того, что вы пытаетесь сделать) - просто скопировать указатель, а во время «глубокой» копии перераспределите и скопируйте его содержимое. Если вам действительно не нужна ссылка на указатель, конечно.

2

Вы не инициализируете элементы в конструкторе, вы объявляете две новые локальные переменные с теми же именами, что и те, что содержатся в классе. И инициализирует их со списком инициализатора будет выглядеть следующим образом:

myClass::myClass(const char *cPtr, const float fValue) 
    : myAdress(cPtr), myFloater(fValue) 
{ 
} 
3

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

0

Попробуйте иметь свой код, как это:

class myClass 
{ 
public: 

    myClass (const char *cPtr, const float fValue); 
    myClass (const myClass& myClassT); 

private: 

    const char* &myAddress; 
    float MyFloater; 

}; 

//myClass.cpp 

myClass::myClass(const char *cPtr, const float fValue) : myAddress(cPtr), MyFloater(fValue) 
{ 
} 

myClass::myClass(const myClass& classType) : myAddress(classType.myAddress), MyFloater(classType.MyFloater) 
{ 
// copy what we did ... 
} 
Смежные вопросы