• Как именно работает данный конструктор list?

    @MiiNiPaa
    Что является результатом данной строки

    Пустой список. Чтобы там что-либо было, туда нужно что-нибудь положить

    И как производить обращение к элементам, в таком случае?

    К первому/последнему — через front/back. К остальным — через итераторы.

    Пример:
    list<vector<string>> lvs {{"Hello", "World"}, {"Goodbye", "Universe"}, {"What", "am", "I", "doing"}};
    for(auto it = list.cbegin(), it != list.cend(), ++it) {//Проходимся по всем элементам списка
        cout << (*it)[1] << '\n';
        // (*it) даст элемент списка: vector<string>
        // Пы можем обратиться к элементу вектора при помощи оператора []
    }
    Ответ написан
    3 комментария
  • Как работает static cast?

    @MiiNiPaa
    Пытается произвести преобразование используя определённые операторы преобразования и конструкторы. Если подобного преобразования нет, выдаст ошибку.

    С указателями на классы связанные отношением наследования всё несколько сложнее:

    1) Преобразование указателя на дочерний класс в указатель на базовый.
    static_cast безопасно приводит типы: возвращаемое значение — указатель на базовый субобъект дочернего класса.

    2) Преобразование указателя на базовый класс в указатель на дочерний.
    Преобразование всегда успешно (нет ошибки компиляции). Если базовый указатель указывает на субобъект дочернего класса, приведение успешно и безопасно. Если базовый указатель не указывает на субобъект дочернего класса, то результат приведения не определён и может случится что угодно.
    struct base 
    {};
    struct derived: base
    {};
    //...
    derived* d = new derived;
    
    //Работает, безопасно
    base* b = static_cast<base*>(d);
    
    //Работает, безопасно так как b на самом деле указывает на derived
    d = static_cast<derived*>(b);
    
    b = new base;
    //Undefined Behavior. Программа превращается в тыкву.
    d = static_cast<derived*>(b);
    Ответ написан
    4 комментария
  • Замена в строке одного символа на другой, как сделать на Си?

    @MiiNiPaa
    Основная проблема в том, что ваши массивы под строки символов замены размером в 1 чар. А писаться будет как минимум 2: введённый символ и символ конца строки.
    Ответ написан
  • Где найти библиотеку?

    @MiiNiPaa
    Она является частью языка. Если компилятор ругается не её отсутствие: выкиньте Turbo C++/установите компилятор по-нормальному.
    Ответ написан
  • Где ошибка в коде на С++?

    @MiiNiPaa
    В введённых значениях. Посчитайте ручками. Вы берёте корень от отрицательного числа.
    Ответ написан
    Комментировать
  • По какому принципу выводятся числа (back_inserter, front_inserter)?

    @MiiNiPaa
    Вы перепутали что при чём выводится. У back_inserter будет 7 8 9 1 2 3, у front_inserter — 3 2 1 7 8 9

    back_inserter вставляет каждый элемент в конец: 7 8 9 → 7 8 9 1 → 7 8 9 1 2 → 7 8 9 1 2 3

    front_inserter — в начало: 7 8 9 → 1 7 8 9 → 2 1 7 8 9 → 3 2 1 7 8 9
    Ответ написан
  • Как заставить сработать исключение std::bad_alloc?

    @MiiNiPaa
    Я напишу ответы на вопросы в комментариях здесь:

    А system("pause") платформонезависимый?
    Нет
    Ведь программа сразу же закрывается. Или како-то это по другому решается?
    Настройте IDE нормально, либо запускайте программы из командной строки, а не двойным щелчком. Это нормальное и правильное поведение для консольных программ.
    Ссылка используется только в случае с std::bad_alloc или с классами тоже?
    Стандарт обработки исключений в С++: бросать по значению, ловить по ссылке.
    То есть, такого типа указатели нужно всегда инициализировать? Если не char* ptr = new char[SIZE], то char* ptr = NULL и на другой строке ptr = new char[SIZE]?
    Если char* ptr = new char[SIZE] бросит исключение, то переменной ptr не существует и удалять нечего. Нужно всегда инициализировать переменную при объявлении. Чем — другой вопрос.

    И да, на современных системах единственный гарантированный способ получить bad_alloc — истощить адресное пространство программы. И убедится, что компилятор не выкинет выделение памяти как ненужное. Проще кинуть bad_alloc самомтоятельно.
    Ответ написан
    Комментировать
  • Как использовать dynamic_cast?

    @MiiNiPaa
    Чтобы безопасно скастовать базовый класс к дочернему.

    Допустим у вас есть указатель Base* foo, который скорее всего указывает на производный класс. И вы хотите скастовать его к производному, чтобы использовать его функции. Но есть шанс, что это не производный класс в таком случае у вас будут проблемы.

    Чтобы избежать проблем можно использовать dynamic_cast(foo). Каст вернёт nullptr в случае, если указатель не указывает на Derived класс.
    Ответ написан
    Комментировать
  • Указатель на указатель?

    @MiiNiPaa
    В современном С++ вообще указателей стараются избегать. Но вот несколько примеров:

    Псевдо2D массив — массив массивов

    Массив указателей. Например вектор хранит внутри указатель на буфер. .data() возвращает этот указатель. Если там хранятся указатели, получается указатель на указатель.

    Когда нужно изменить указатель и используется АПИ С: указатель на объект используется если нужно изменить объект так, чтобы ето было видно вне изменяющей функции. В данном случае объект — другой указатель.
    Ответ написан
    2 комментария
  • Почему нельзя объявлять стековые объекты внешних классов для внутренних классов?

    @MiiNiPaa
    Класс считается complete когда при его парсинге достинается закрывающая скобка. При объявлении вложенного класса внутри внешнего, он ещё не полон и объявить член его типа нельзя. Указатель на неполный тип создавать можно, поэтому первый вариант компилируется.

    Поправить можно так:

    struct Outer 
    {
      struct Inner;
    };
    
    struct Outer::Inner 
    {
        Outer _outer;
        Inner() : _outer() { }
    };
    Ответ написан
    1 комментарий
  • C++, не найден конструктор по умолчанию,в чем проблема?

    @MiiNiPaa
    Fl_Window(x,y,w,h,t.c_str()); Здесь вы создаёте временный локальный объект типа Fl_Window. Это точто то, что вам надо?

    Если вы хотите инициализировать базовый класс, делайте это в списке инициализации:
    mainWindow(int w, int h, int x, int y,const string& t) : Fl_Window(x,y,w,h,t.c_str())
      {}
    Ответ написан
    4 комментария
  • Вывод в edit текста из .txt файла как?

    @MiiNiPaa
    SetWindowText ожидает перевод строки размером в 2 байта(0x0D 0x0A). ifstream превратит 2хбайтовый перевод строки в однобайтовый для внутреннего хранения. Можете прочесть файл как двоичный: ifstream ifs(nameFile, "ios::binary");
    Ответ написан
    Комментировать
  • Почему не отрабатывает перегруженный конструктор класса?

    @MiiNiPaa
    Потому что это copy-initialization. Чтобы она работала, нужен конструктор копирования который умеет принимать в качестве параметра временные обекты. (даже учитывая то что он не будут вызван благодаря copy-elision)

    Edit: en.cppreference.com/w/cpp/language/copy_initialization
    If T is a class type, and the type of other is different, or if T is non-class type, but the type of other is a class type, user-defined conversion sequences that can convert from the type of other to T (or to a type derived from T if T is a class type and a conversion function is available) are examined and the best one is selected through overload resolution. The result of the conversion, which is a prvalue temporary if a converting constructor was used, is then used to direct-initialize the object. The last step is usually optimized out and the result of the conversion is constructed directly in the memory allocated for the target object, but the appropriate constructor (move or copy) is required to be accessible even though it's not used.
    Грубо говоря сначала то, что справа неявно приводится к типу слева (при помощи конструктора) а потом используется для инициализации переменно с помощью move или copy-конструктора.
    Ответ написан
    Комментировать
  • Почему не получается полностью перегрузить оператор =?

    @MiiNiPaa
    Ошибка. Почему?
    Потому что вы не вызываете оператор присваивания, а совершаете copy-initializtion. Вам может помочь простое правило: все действия совершаемые при объявлении переменной вызывают конструктор.
    Ответ написан
    1 комментарий
  • Как преобразовать string[] в char[]?

    @MiiNiPaa
    1) Используйте stoi чтобы превратить каждую строку в число.
    2) Присваиваете каждое полученное число элементу чар массива.

    Код (кодировка символов в строке — CP866):
    #include <algorithm>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string strings[] = {"143", "224", "168", "162", "165", "226"};
        char line[16] {};
    
        std::transform(std::begin(strings), std::end(strings), std::begin(line),
                       [](const std::string& s) {
                            return std::stoi(s); });
        std::cout << line;
    }
    Ответ написан
    Комментировать
  • Как рассчитать время выполнения программы?

    @MiiNiPaa
    Как подозреваю, ваше задание это присвоить взятые (с потолка?) значения различным операций, интерпретировать программу и суммировать "стоимости" всех выполненных операций.
    Ответ написан
    Комментировать
  • Как узнать, какую версию языка поддерживает транслятор?

    @MiiNiPaa
    Почитать стандарт языка и посмотреть как это определить.

    Например, если макро __STDC_VERSION__ имеет значение как минимум 201112L, значит компилятор поддерживает С11, как минимум 199901L — С99, 199409L — С94.

    Если ни один из этих макро не определён, но __STDC__ определён — С89
    Ответ написан
    Комментировать
  • Наследование интерфейсов С++?

    @MiiNiPaa
    Так у вас же ромбовидное наследование.

    TcpSocket::ITcpSocket::start определено, а IServer::ITcpSocket::start — нет.

    Вот и проблемы. Можно их решить, наследуясь от интерфейсов виртуально.
    Ответ написан
    Комментировать
  • Как разобраться во всех этих синтаксисах ассемблера?

    @MiiNiPaa
    Берёте ассемблер который вам нужен и изучаете его. Понадобился другой (скажем, под другую платформу или для интеграции с другой билд-системой) — учите его. Благо отличаются ассемблеры для одной платформы обычно мелочами.

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

    Если есть ассемблер под разные ОС, можно писать одинаковый код под эти ОС. Но нужно учитывать, что как только нужно будет обратится к АПИ этой ОС, тут уже придётся потрудится: какую библиотеку подгружать, как передавать аргументы и т.п.
    Ответ написан
    1 комментарий
  • В чем разница между int a() и int a=int()?

    @MiiNiPaa
    А теперь выведите typeid(first).name() на экран и удивитесь.

    Первая строчка это объявление функции first без параметров и возвращающая int. Имя функции превращается в указатель, указатель конвертируется в bool (true), который конвертируется в int (1).
    Ответ написан
    3 комментария