Как включить std:list в список параметров конструктора (С++)?

У меня есть устаревший код, написанный на BorlandC++ с использованием Tlist и других специальных классов Borland. Я полный нуб в STL.

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

MyData (TStringList *fileList)

объявление ниже дает ошибку «отсутствует» «)» ! (скомпилировано в BorlandC++/embarcadero)

MyData (std:list<string> *fileList)

Что не так выше? как это должно быть объявлено с помощью std:list

(Я знаю, что придется изменить много кода, поскольку TStringList не имеет тех же методов, что и std:list.)

почему вы хотите заново объявить конструктор для начала? У них не только разные методы, но и два разных типа

463035818_is_not_a_number 16.02.2019 17:52
std::list — название шаблона; это не может быть тип аргумента, потому что это не тип. Угадайте, из TStringList, возможно, вы ищете MyData(const std::list<std::string>& fileList)?
Pete Becker 16.02.2019 17:52

Правильно ли вы использовали #include <list> в своем коде?

πάντα ῥεῖ 16.02.2019 18:05

Когда-то я работал с библиотекой классов Borland (до STL). То, что вы пытаетесь сделать, одновременно и благородно, и очень разочаровывает. Особенно, если вы полный нуб в STL. Первое, что нужно сделать, это прочитать о стандартной библиотеке C++, которая взяла STL и продолжила ее развитие. Я рекомендую книгу Страуструпа «Язык программирования C++» (4-е издание).

Eljay 16.02.2019 18:07
@неро«Я знаю, что много кода придется изменить»TStringList также имеет совершенно другое поведение в отношении уведомлений других компонентов об изменениях, внесенных в экземпляр. Наверное, это не такая уж хорошая идея. чтобы заменить это на std::list<std::string>. Кроме того, я бы предпочел использовать std::vector<std::string>, если вы действительно уверены, что можете его заменить.
πάντα ῥεῖ 16.02.2019 18:14

Почему std:list<string> с одним двоеточием? Должно быть std::list<string> (двойное двоеточие).

Robert Andrzejuk 16.02.2019 18:22

Крутое это место! Спасибо всем.

nero_pelleman 16.02.2019 18:48

@ user463035818, потому что AnsiString, List и StringList недоступны в VisualC (я полагаю)

nero_pelleman 16.02.2019 18:50

@Eljay, спасибо, боюсь, впереди много работы! :D .@πάντα ῥεῖ Интересное предложение об использовании вектора, я рассмотрю это. И да, одно двоеточие было досадной ошибкой :)

nero_pelleman 16.02.2019 18:53

К вашему сведению, TStringList содержит динамический массив строк, поэтому он будет ближе к std::vector<std::string>, чем к std::list<std::string>, который представляет собой двусвязный список, а не массив. Не позволяйте именам обмануть вас. Вы должны понимать семантику, чтобы эффективно переводить. Вы можете подумать о написании собственного класса TStringList, который имеет тот же открытый интерфейс, что и класс Borland, но внутри использует STL. То же самое с AnsiString и другими классами Borland. Таким образом, у вас будет меньше кода для перевода

Remy Lebeau 16.02.2019 19:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
211
1

Ответы 1

Пространства имен использовать оператор разрешения области видимости ::, а не одно двоеточие :

И list, и string находятся в пространстве имен std, поэтому доступ к ним осуществляется с помощью ::.

Это работает: MyData(std::list<std::string> *fileList)


Из комментария Томаса Мэтьюза: передача по ссылке предпочтительнее передачи по указателю: MyData(std::list<std::string> &fileList)

Кроме того, передача по ссылке предпочтительнее передачи по указателю.

Thomas Matthews 16.02.2019 19:07

@ThomasMatthews Я предпочитаю передачу по указателю, если фактический объект будет изменен. При вызове функции неясно, будет ли изменен объект, если вы используете передачу по ссылке: MyData(&fileList) vs MyData(fileList).

user644361 16.02.2019 19:27

Если вы не хотите, чтобы объект был изменен, перейдите по ссылке const. Это должно быть достаточно ясно.

Blastfurnace 16.02.2019 19:52

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

Mellester 16.02.2019 22:47

Другие вопросы по теме