Инициализация массива в C ++ - PullRequest
0 голосов
/ 12 октября 2009

Я пытаюсь инициализировать массив объектов:

SinglyLinkedList offeredClasses[22] = {SinglyLinkedList("CSCE101"),SinglyLinkedList("CSCE101L"),SinglyLinkedList("CSCE150E"),SinglyLinkedList("CSCE150EL"),SinglyLinkedList("CSCE150EM"),SinglyLinkedList("CSCE150EML"),SinglyLinkedList("CSCE155"),SinglyLinkedList("CSCE155H"),SinglyLinkedList("CSCE156"),SinglyLinkedList("CSCE230"),SinglyLinkedList("CSCE230L"),SinglyLinkedList("CSCE235"),SinglyLinkedList("CSCE251"),SinglyLinkedList("CSCE310"),SinglyLinkedList("CSCE322"),SinglyLinkedList("CSCE361"),SinglyLinkedList("CSCE351"),SinglyLinkedList("CSCE451"),SinglyLinkedList("CSCE423"),SinglyLinkedList("CSCE428"),SinglyLinkedList("CSCE486"),SinglyLinkedList("CSCE487")};

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

2 рассматриваемых конструктора:

SinglyLinkedList(string course); //Constructor
SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

Мне нужен конструктор копирования для других вещей, поэтому я не могу удалить его.

Спасибо за вашу помощь!

Ответы [ 5 ]

6 голосов
/ 12 октября 2009

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

Ваши инициализаторы являются временными объектами, что означает, что нет абсолютно никакого способа вызвать конструктор копирования. Если ваш компилятор делает это, это означает, что он либо сломан, либо вы используете какой-то набор настроек, которые заставляют его вести себя странным образом несовместимым образом. Какой компилятор вы используете?

Это первая часть ответа.

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

И, наконец, третья часть ответа.

Вы говорите, что конструктор копирования называется вместо конструктора преобразования. На самом деле, оба называются. Если вы посмотрите внимательно, вы увидите это. Сначала вызывается конструктор translation для создания промежуточного временного объекта типа 'SinglyLinkedList' из предоставленной вами строки (которая также включает в себя создание временного объекта 'std :: string'), а затем конструктор копирования вызывается для того, чтобы инициализировать элемент массива из временного (это происходит для каждого элемента в массиве). Вот как это должно быть в C ++, при условии, что ваш copy-constrcutor объявлен правильно, то есть с константным ссылочным параметром. Но с неконстантным ссылочным параметром конструктор копирования не может быть вызван, а код некорректен.

1 голос
/ 12 октября 2009

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

explicit SinglyLinkedList(string course); //Constructor
explicit SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

Таким образом, у вас больше шансов вызвать правильный конструктор.

С другой стороны, компилятор конструктора ищет это SinglyLinkedList( const char* ). Попробуйте создать экземпляр строки напрямую, например, SinglyLinkedList( string("CSCE101") )

0 голосов
/ 12 октября 2009

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

explicit SinglyLinkedList(std::string const& name);
SinglyLinkedList(SinglyLinkedList const& other);

Затем добавьте оператор присваивания и деструктор:

~SinglyLinkedList();
SinglyLinkedList& operator=(SinglyLinkedList const& other);

Я удивлен, что он компилируется вообще, поскольку без const s два конструктора должны быть неоднозначными.

0 голосов
/ 12 октября 2009

Подпись вызываемых вами конструкторов SinglyLinkedList (char const *)

Что вы не предоставили. Так что либо создайте конструктор, принимающий char const *, либо назовите их как SinglyLinkedList (string ("CSCE101"))

Не существует неявного преобразования из char * в std :: string - поэтому ваш компилятор должен увидеть, какая перегрузка соответствует, и он находит совпадающий SinglyLinkedList.

0 голосов
/ 12 октября 2009

Что вам нужно, чтобы конструктор копирования не создавал копию? Если вам это нужно для чего-то другого, вам нужно изменить это другое. Это делает действительно трудным для понимания код, даже если вы игнорируете проблемы, которые вы сейчас испытываете. Это та же проблема, которую люди вызывают в математических библиотеках, выполняя такие вещи, как перегрузка оператора ^ для создания перекрестного продукта.

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

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