2010-12-13 3 views
1

Я новичок в программировании на С ++, и я буду счастлив, если вы сможете мне помочь. я попытался написать этот код:новый объект в C++

bool RailwayLineList:: AddInTail(const RailwayLine& data) 
{ 
    //there is no linked list to add the element 
    if(this==NULL) 
     return false; 
    RailwayLineLink *newLink = new RailwayLineLink(data); 
} 

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

Почему вы вызываете конструктор копирования?

+0

Привет, добро пожаловать в StackOverflow. В будущем, когда вы пишете код, вы должны выделить его и нажать на кнопку с двоичным кодом; это будет отформатировать его так, чтобы он отображался правильно. :-) –

+1

Не видя конструктора 'RailwayLineLink', который вы используете, его трудно сказать, но он уверен, что« потому что вы просили его ». Поместите точку останова на пустой конструктор копирования (к какому классу вы спрашиваете, кстати?) И убедитесь, что столбец стоит. –

+0

@Platinum Azure: WTF ?!Я добавил пробелы вручную для каждой строки кода, который я написал! ; ( – BlackBear

ответ

1

if (this == NULL) технически допустимая конструкция, но к моменту ее достижения неопределенное поведение уже сформировано, если утверждение может быть истинным. НЕ ДЕЛАЙ ЭТО!!!

+0

Возможно, это было лучше, чем комментарий или добавление к фактическому ответу. – 3Doubloons

+0

Это должен быть комментарий, а не ответ. –

+0

Нет ничего плохого в сравнении этого с NULL, поведение, ведущее к этому, становится NULL, является фактическим источником проблемы. –

2

Конструктор копирования - это конструктор с определенной подписью. Он принимает один параметр, const ссылается на тот же тип, который строится. Таким образом, для class Foo, конструктор копирования выглядит следующим образом:

Foo::Foo(const Foo&) 

Есть 2 другие виды конструкторов: по умолчанию и преобразования. Конструктор по умолчанию не принимает никаких параметров (или можно назвать, как если бы она не предпринимала никаких параметров, например, все параметры имеют значения по умолчанию):

Foo::Foo() 

... и новообращенный деструктор в основном что-нибудь еще. Например:

Foo::Foo(const Bar&) 

почему конструктор копирования вызывается?

В вашем случае, вы звоните в RailwayLineLink конструктор, но переходящая в константной ссылке на RailwayLine, так что вы на самом деле вызвать конструктор новообращенного, а не конструктор копирования.

Конструктор преобразования называется потому, что вы назвали его:

new RailwayLineLink(data); 

Это создает новый объект RailwayLineLink, передавая data в качестве единственного параметра конструктору.

Если у вас есть пустой конструктор новообращенного, который выглядит примерно так:

RailwayLineLink::RailwayLineLink(const RailwayLine&) 
{ 
} 

... тогда все члены новой копии будет по умолчанию, построенные и, вероятно, содержит мусор.

Обычно при реализации конструктора копирования, вы хотите сделать какой-то почленно копию от оригинала к копии, как это:

RailwayLineLink::RailwayLineLink(const RailwayLine& rhs) 
: value_(rhs.value_) 
{ 
} 
+0

Посмотрите внимательно ... параметр 'data' на самом деле имеет тип' const RailwayLine & ', который, я думаю, мы можем согласиться, возможно, отличается от' const RailwayLineLink & '. Хотя, учитывая историю изменений вопроса, это может быть опечатка! * (EDIT: Говоря о опечатках, я сделал несколько здесь ... D'oh!) * –

+0

Вопрос неясен о том, какой конструктор копирования вызван неожиданно: 'RailwayLine',' RailwayLineLink' или 'RailwayLineList' –

+0

@ Платина: Ах, ты прав! Я полностью пропустил это. –

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