Копировать конструктор - PullRequest
0 голосов
/ 27 марта 2009

Я пытаюсь сделать часть "глубокого копирования" с помощью моего конструктора копирования:

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;
}

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

Они инициализированы в конструкторе! Что мне нужно сделать с адресом объекта classtype?

Ответы [ 5 ]

7 голосов
/ 27 марта 2009
const char* &myAddress;

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

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

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

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

3 голосов
/ 27 марта 2009

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

3 голосов
/ 27 марта 2009

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

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

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

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

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

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

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

2 голосов
/ 27 марта 2009

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

myClass::myClass( const char *cPtr, const float fValue )
    : myAdress(cPtr), myFloater(fValue)
{
}
0 голосов
/ 27 марта 2009

Попробуйте ваш код так:

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 ... 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...