c ++ self в списке инициализации - PullRequest
0 голосов
/ 17 мая 2011

у меня есть этот фрагмент кода

class Osoba{
         Osoba(char* imie,int wiek){                         
                     this->imie=new char[strlen(imie)+1];
                     strcpy(this->imie,imie);
                     this->wiek=wiek;
                     cout<<"Utworzono Osobe "<<this->imie<<endl;
         }
         Osoba(Osoba& x){
                 Osoba(x.imie,x.wiek);
         }
[...]

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

Edit: если я использую

         Osoba(Osoba& x): Osoba(x.imie,x.wiek){

я получаю type 'class Osoba' is not a direct base of 'Osoba'

как это сделать?

Ответы [ 4 ]

10 голосов
/ 17 мая 2011

Вы не можете так называть конструкторов.Ну, вы можете, но то, что происходит, это создание безымянного временного объекта.Напишите ваш конструктор копирования без ссылки на другой конструктор.Кроме того, если вы используете std :: string вместо char *, вам не понадобится конструктор копирования.Если вы продолжите использовать char *, вам также понадобятся деструктор и оператор присваивания.

3 голосов
/ 17 мая 2011

Вы должны инициализировать элементы Osoba, так же, как вы это делаете в другом конструкторе.

В C ++ 2011 можно использовать только конструкторы (с другим синтаксисом).*

1 голос
/ 17 мая 2011

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

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

Другими словами, если у вас есть

struct Foo
{
    virtual void doit() { ... }
    Foo() {
        doit();
    }
};

struct Bar : Foo
{
    virtual void doit() { ... }
};

во время конструктораиз Bar вызванная реализация doit будет определена в Foo, потому что во время конструктора базовой части производного объекта объект является только "базовым" объектом.Только в конце конструктора он становится «производным» объектом прямо перед выполнением любого в конечном итоге присутствующего кода в «производном» конструкторе.

Будьте осторожны, чтобы другие объектно-ориентированные языки использовали другиеподход ...

Для объяснения того, что именно происходит в C ++ , см. эту статью .

Если вам нравится вместо юридического описания, это то, что указано в C ++стандарт по 12.7.4:

Функции-члены, включая виртуальные функции (10.3), могут вызываться во время создания или уничтожения (12.6.2).Когда виртуальная функция вызывается прямо или косвенно из конструктора (в том числе из mem-initializer для члена данных) или из деструктора, и объект, к которому применяется вызов, является объектом, находящимся в процессе создания или уничтожения, вызываемая функция являетсяодин определяется в собственном классе конструктора или деструктора или в одной из его баз, но не является функцией, переопределяющей его в классе, производном от класса конструктора или деструктора, или переопределяющим его в одном из других базовых классов наиболее производного объекта (1.8).Если вызов виртуальной функции использует явный доступ к члену класса (5.2.5), а выражение объекта ссылается на объект, находящийся в процессе создания или уничтожения, но его тип не является ни собственным классом конструктора, ни деструктора, ни одной из его баз, результатзвонок не определен.

0 голосов
/ 17 мая 2011

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

который сказал, Правильно ли я считаю, что в вашем классе было два поля, imie и wiek?

просто повторите код инициализации, на этот раз с x.imie и x.wiek в качестве ввода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...