Ответы пользователя по тегу C++
  • Как удалить подстроку из строки c++ (char)?

    @alex-t
    Прогр. в команде rco.ru
    Надо вызвать функцию
    strcpy(начало_удаляемой подстроки, конец_удаляемой_подстроки);

    Таким образом текст скопируется "ближе к началу", и затрет то, что надо удалить.
    Но лучше перейти на std::string, там все попроще.
    Ответ написан
    Комментировать
  • Не подключается заголовочный файл к проекту?

    @alex-t
    Прогр. в команде rco.ru
    В "Header.h" либо только
    int Second();
    а тело в отдельном cpp, либо же, для коротких функций,
    inline int Second()
    {
    return 0;
    }
    Ответ написан
  • В чём разница указателей и ссылок?

    @alex-t
    Прогр. в команде rco.ru
    По сути - там и там адрес. Но ссылка указывает на уже существующий объект, а указатель может быть нулем, что иногда удобно. Указатель легче сделать невалидным, указывающим "в мусор", ссылку несколько сложнее, но и она не защищена от этого.

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

    На мой взгляд, в случаях, когда нет специального значения нулевого указателя, можно использовать ссылки.
    Ответ написан
    Комментировать
  • Как создать глобальный объект для всех элементов проекта?

    @alex-t
    Прогр. в команде rco.ru
    Ну extern сообщает компилятору, что где-то (в каком-то модуле cpp) этот объект стоит без extern.
    Ответ написан
    1 комментарий
  • Как использовать const объект в разных файлах cpp без копирования (C++14)?

    @alex-t
    Прогр. в команде rco.ru
    Тут вопрос, когда этот объект создается.
    Если до старта main(), и опять-таки до старта main никем не используется, то часто достатлчно простого extern.
    Если не совсем так, то начинайте "окучивать" синглтон...
    Ответ написан
  • THIS_POST_IS_DELETED?

    @alex-t
    Прогр. в команде rco.ru
    Если проблема в описании "схвачена" верно, то надо сначала построить в какой-нибудь std::vector список всех файлов, а потом с ним "работать".

    Если работа с файлами планируется по-серьезному, можно использовать библиотеку boost::filesystem.

    Раз уж язык C++ - используйте std::string.

    Данная программа не будет работать, если попадется файл с греческими буквами, например. И, вы удивитесь, но путь к файлам уже может быть больше MAX_PATH.

    Ну и наконец, если программа не занимается какой-то чилодробительной обработкой, C++ - неправильный выбор.
    Ответ написан
    Комментировать
  • Как создать проинициализированное статическое поле?

    @alex-t
    Прогр. в команде rco.ru
    2 варианта на выбор:
    class Foo
    {
    	static boost::array<std::string,3> a3;
    	static std::vector<std::string> v3;
    };
    boost::array<std::string,3> Foo::a3 = {"aa", "bb", "cc"};
    std::vector<std::string> Foo::v3 = boost::assign::list_of("aa")("bb")("cc");


    Можно просто С-массив из const char * проинициализировать первым способом, но с ним чуть сложнее работать.
    А проверку наличия надо не через std::vector, а через std::set (вторым способом тоже можно заполнить).
    Ответ написан
    Комментировать
  • Есть ли разница между char* и char[число] при передаче аргументов функции?

    @alex-t
    Прогр. в команде rco.ru
    Проблема в том, что именно компилятор НЕ будет ругаться...
    Передавая (точно так же) массив ( process_array(array);) можно либо явно контролировать длину массива
    void process_array4 (char (&array)[4]) {
      for (int i = 0; i < 4; i++)
        array[i]++;
    }

    Либо написать функцию, которая скомпилируется с нужной длиной
    template <size_t N>
    void process_arrayN (char (&array)[N]) {
      for (int i = 0; i < N; i++)
        array[i]++;
    }
    Ответ написан
    Комментировать
  • Таблица с разными типами данных в c++, как создать?

    @alex-t
    Прогр. в команде rco.ru
    Уже упоминавшийся boost::variant, если определен список возможных типов, в boost::variant удобно организовать общие оперции, специфицируя их для каждого типа.
    Если тип вообще не известен - boost::any (но так бывает уж совсем редко).
    Ответ написан
    Комментировать
  • Как вызывать MultiByteToWideChar?

    @alex-t
    Прогр. в команде rco.ru
    Преобразование, скорее всего, правильное, если хотите проверить результат без проблем, смотрите в отладчике VisualStudio, а вот если с проблемами, то осваивайте консоль Windows. Там работает только такой извращенный способ:
    #include <windows.h>
    ....
    DWORD n;
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"фыва", 4, &n, 0);
    Ответ написан
    Комментировать
  • Указатель на указатель?

    @alex-t
    Прогр. в команде rco.ru
    Указатель на указатель часто встречается в "старых" интерфейсах С++ и в "просто С", когда надо в функции выделить память и что-то туда положить. Что-то типа
    int foo(int **bar)
    {
    	*bar = new int;
    	**bar = 123;
    	return 0; // код ошибки
    }

    В современном С++ лучше написать функцию вида
    std::unique_ptr<int> foo();
    а возможные ошибки реализовать на исключениях, так и память не утечет, и код ошибки при каждом вызове проверять не надо. Кроме того, возврат автоуказателя не вызовет у "вызывающего" кода вопросов, должен ли он потом освободить память полученную по указателю, или нет.
    Ответ написан
    Комментировать
  • Почему так происходит?

    @alex-t
    Прогр. в команде rco.ru
    Ну вот так она (консоль в Винде) устроена... Правильный вывод 2-байтовых символов будет системным вызовом WriteConsoleW. Если захотите использовать вывод через потоки, придется написать свой. При этом, для большего развлечения, не забудьте учесть возможность перенаправления вывода программы в файл.
    Ответ написан
    Комментировать
  • Как начать работать с базой данных Access в visual studio на C++?

    @alex-t
    Прогр. в команде rco.ru
    Если с базой данных вообще, и в частности с Access, то можно смотреть интерфейс работы с ODBC. Там, с помощью драйверов, есть достаточно похожий доступ к разным БД. Хотя, ИМХО, Access не лучший выбор... Если все-таки по каким-то требованиям Access, то можно поискать, есть ли у MS соответствующий SDK, хотя с точки зрения универсальности и дальнейшего использования опыта все равно можно использовать SQL-запросы через ODBC.
    Ответ написан
    Комментировать
  • Полиморфизм в C++ и как правильно его реализовать с использованием указателя на void?

    @alex-t
    Прогр. в команде rco.ru
    1. Ну еще раз, а то это где-то в комментариях не очевидно. Оператор ++ для указателя должен сместиться на размер объекта. Поэтому 100% правильно будет работать только на конкретном унаследованном классе. А на базовых, тем более интерфейсных, если "сильно повезет".
    2. Из примера непонятно, зачем нужно использовать указатель void, вместо итератора по массиву.
    Ответ написан
    1 комментарий