Ответы пользователя по тегу C++
  • Enum forward declaration - что я делаю не так?

    @Lol4t0
    Просто так нельзя обявить, так же как нельзя объявить таким образом класс

    enum class SomeClass::InnerEnum : int; //not valid
    class Outer::Inner; //not valid
    class some_namespace::Class; //not valid
    Ответ написан
  • Есть ли механизм проверки валидности указателей в C++?

    @Lol4t0
    Вам нужна архитектура с контролем удаления объекта. Сделать такое можно, но сложность довольно сильно возрастает:

    #include <unordered_set>
    
    
    class delegate;
    
    class delegate_object_impl
    {
    public:
        void setDelegate(delegate* delegate)
        {
            _d.insert(delegate);
        }
    
        void clearDelegate(delegate* delegate)
        {
            _d.erase(delegate);
        }
        virtual ~delegate_object_impl();
    
    private:
        std::unordered_set<delegate*> _d;
    };
    
    template <typename T>
    struct delegate_object: T, delegate_object_impl
    {
        template<typename...Args>
        delegate_object(Args... args):
            T(args...)
        {}
    };
    
    class delegate
    {
    public:
        template<typename T, typename ... Args> 
        explicit delegate(delegate_object<T>* owner, void(T::*)(), Args ... args):
            _owner(owner)
        {
            //...
            owner->setDelegate(this);
        }
    
        delegate_object_impl* _owner;
    
        ~delegate()
        {
            if (_owner) {
                _owner->clearDelegate(this);
            }
        }
    
        void operator()()
        {
    
        }
    
        void forget()
        {
            _owner = 0;
        }
    };
    
    delegate_object_impl::~delegate_object_impl()
    {
        for (delegate* d : _d) {
            d->forget();
        }
    }


    Понятное дело, что городить такое имеет смысл только тогда, когда ситуация, приведенная вами, является не ошибкой программиста а частью нормального жизненного цикла системы.
    Ответ написан
  • Есть ли какой-то механизм уведомлений/сигналов на С++, подобно Qt?

    @Lol4t0
    Если говорить в общем, то вас интересует шаблон проектирования Observer

    Реализаций его может быть придумано большое количество

    * На WinAPI с использованием системы сообщений
    * На С с использованием указателей на функции
    * На С++ с использованием std::function или любого другого объекта, интерфейс которого известен
    * На С++ с использованием boost::signals
    * Qt signals/slots
    * и т.д.
    Ответ написан
    1 комментарий
  • Каков план личностного развития C++ программиста с нуля?

    @Lol4t0
    Мой ответ касается практической части, про книжки смотрите другие ответы.
    Для того, чтобы действительно разобраться в языке, нужно писать на нем. Причем писать такой код, который поток кто-то проверит, укажет на недостатки, подскажет, как сделать лучше.

    Для этого вам можно или найти какой-нибудь курс, или поучаствовать в opensource проекте с code review, причем довести свои патчи до merge в master. С этим, правда, бывают сложности, если вы совсем начинающий, потому что никому от вас толку не будет.
    Тут есть еще один вариант, про который почему-то никто никогда не упоминает. Отвечать на вопросы. Вот так вот как вы сейчас задаете вопросы, только отвечать. Конечно, вам не пойдет ванильный тостер без дизлайков, с малым количеством вопросов и специфическим русскоязычным сообществом. Вам нужно на StackOverflow. Просто смотреть подряд вопросы, пытаться решать, постить ответы, сравнивать с теми ответами, которые пишут другие люди и делать выводы. Если вы будете писать ерунду, вас там поправят, опять же. Я в свое время довольно много таким образом узнал где-то за полгода.
    Ответ написан
    1 комментарий
  • QT Creator - почему intellisense не "видит" функций и поля объекта через auto тип С++11?

    @Lol4t0
    Ну не работает. Даже bug заведен.

    Если у вас std::vector<SomeValueType> pingAddr;, то можно писать
    for(auto iter=pingAddr.begin();iter!=pingAddr.end();iter++)
            {
                    SomeValueType& v = *iter;
                    avrPing += v.getResult().avrRTT; //автодополнение будет работать, 
                    //а код все равно проще, чем если писать название типа вместо auto
    
                    i++;
            }
    Ответ написан
    2 комментария
  • Как перехватить множество исключений в деструкторах при наследовании?

    @Lol4t0
    А потому что не надо выпускать исключения из деструктора - необходимо все их там же и ловить.

    В частности, в вашем случае - если исключение будет брошено из деструктора в процессе обработки другого исключения, приложение завершится.

    stackoverflow.com/questions/130117/throwing-except...
    Ответ написан
    Комментировать
  • Как подключить Sqlite в Windows Forms приложение (visual studio 2010)

    @Lol4t0
    Не писать на c++-cli

    Есть драйвера для и для .Net и для Qt.
    Ответ написан
    Комментировать
  • Как осуществить чтение больших файлов на QT?

    @Lol4t0
    У вас просто закончилась память.

    32-битному приложению на x86 архитектуре доступно по умолчанию 2 ГБ пользовательской памяти. С учетом того, что в эту же память замплен код самого приложения и библиотек, и фрагментации кучи - числа порядка 1.5 ГБ - практический потолок использования памяти.

    Или думайте, как уменьшить расход памяти - или переходите на 64 бита.
    Ответ написан
    Комментировать
  • (C++) Клиент-Серверное взаимодействие. Многопоточность. Когда? Как?

    @Lol4t0
    Кроссплатформенность достигается путем использования кроссплатформенных библиотек. Используйте возможности C++ Standard Library, изучите boost.

    В частности, для работы с сетью и распределения задач boost asio.

    Нужна или нет многопоточность - вопрос неоднозначный. Если производительности одного потока хватает, то лучше в нее не влезать. А для того, чтобы избежать задержек, использовать асинхронное общение с файловой системой и сетью, концепцию сигналов-слотов (boost asio, boost signals)
    Ответ написан
    Комментировать
  • Использование stencil в blitz++ 0.10

    @Lol4t0
    судя по коду библиотеки, вам нужно вызывать Laplacian3D непосредственно из main, а не из "трафарета". Последний, как я понял, нужен, если вы хотите выполнить некоторые действия над всеми элементами матриц. И внутрь вам передаются не массивы, а их элементы.

    Но я вообще не профи в blitz, просто мимо проходилкод посмотрел.
    Ответ написан
  • Почему в элементе библиотеки tinyxml нет работает метод QueryStringAttribute?

    @Lol4t0
    Навеное, библиотека собрана без поддержки STL

    tinyxml.h:
    #ifdef TIXML_USE_STL
            /// QueryStringAttribute examines the attribute - see QueryIntAttribute().
    	int QueryStringAttribute( const char* name, std::string* _value ) const {
    		...
    #ifdef TIXML_USE_STL


    По умолчанию, данная опция выключена
    Makefile
    # TINYXML_USE_STL can be used to turn on STL support. NO, then STL
    # will not be used. YES will include the STL files.
    TINYXML_USE_STL := NO
    Ответ написан
    Комментировать
  • Как поставить русский язык на элементах графического интерфейса пользователя?

    @Lol4t0
    Вам остается только проверить кодировку и убедиться, что файл закодирован в UTF-8. Qt до 5й версии по умолчанию использовала ANSI кодировку при конструировании QString из строковых литерал, но это не ваш случай. Qt 5 использует Utf-8 (и именно его).

    Вам нужно убедиться, что файл сохранен в Utf-8. В QtCreator (если вы его используете) есть настройки кодировок для новых файлов, но их изменение не приводит к изменению кодировки уже созданных файлов.

    Для перекодирования файла нужно его открыть, выбрать меню>правка>выбрать кодировку>выбрать Utf-8 из списка, нажать Сохранить в кодировке. Если при открытии видим "мусор", выбираем вышеназванный пунк меню, затем выбираем "Перезагрузить в кодировке (Windows 1251), а уже потом пересохраняем в Utf-8.
    Ответ написан
    1 комментарий
  • Как произвести запись кирилицы и символов других языков в текстовый файл?

    @Lol4t0
    На самом деле правильно писать все-таки через потоки, надо только настройки локали задать, как положено.

    С Visual Sudio все просто:
    std::locale::global(std::locale("Russian"));
    std::wcout << L"привет";

    Mingw не умеет виндовые локали, поэтому нужно писать велосипед (за исключением того, что будет CP_ACP вместо CP_OEM
    Ответ написан
    Комментировать
  • Почитал про различные компиляторы и остановился на gcc, но не понимаю, как им пользоваться?

    @Lol4t0
    А я думаю, что начать лучше все-таки с IDE, во-всяком случае, если работаете на Windows.

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

    Поэтому я думаю, что для начала можно поставить Visual С++ Express и начинать писать код через 20 минут :)

    На Linux, действительно, можно начинать без IDE, тем более что никаких IDE для плюсов там и нет.
    Ответ написан
    1 комментарий
  • Создание виджета открытых документов в Qt?

    @Lol4t0
    Вам нужно разделить логику и представление. Смотрите в сторону MVC какого-нибудь. Причем я говорю не столько про Qt модели, сколько про концепцию в целом.
    Ответ написан
    Комментировать
  • Что быстрее: n%2 или n&1 (c++)?

    @Lol4t0
    Вы еще попробуйте заставить компиллятор использовать деление вместо конъюнкции. Clang еще можно, а вот gcc отказывается даже с полностью отключенной оптимизацией.

    int main(int n, char**)
    {
      if (n%2)
      {
        return 1;
      };
    }


    main:
    	push	rbp
    	mov	rbp, rsp
    	mov	DWORD PTR [rbp-4], edi
    	mov	QWORD PTR [rbp-16], rsi
    	mov	eax, DWORD PTR [rbp-4]
    	and	eax, 1
    	test	eax, eax
    	je	.L2
    	mov	eax, 1
    	jmp	.L3
    .L2:
    	mov	eax, 0
    .L3:
    	pop	rbp
    	ret
    Ответ написан
    3 комментария
  • В чем странности цикла?

    @Lol4t0
    Что значит, игнорируется? Просто после первого выполнения внутреннего цикла, j так и останется равной n и потому внутренний цикл будет выполнен только один раз. (это еще повезло, что в С++ глобальные переменные инициализируются нулем)

    А все потому, что говорила же мама объявлять переменные как можно ближе к месту использования :)
    Ответ написан
    3 комментария
  • Что подразумевает C++ класс с private конструктором и парным auto_ptr?

    @Lol4t0
    const foo::Bar& myfunc(); 
    

    В своем C-адаптере я переопределяю ее так:

    const foo_Bar_t* myfunc();
    

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

    Правильно ли я понимаю, что я не могу хранить этот указатель после возврата из функции?

    Все зависит от того, что делает функция:

    const int g = 1;
    struct S
    {
    	const int & foo() const
    	{
    		return v;
    	}
    	const int & bar() const
    	{
    		return g;
    	}
    	int v = 0;
    };
    
    const int & foobar()
    {
    	S s;
    	//return s.foo(); // oops
    	return s.bar(); //ok
    }
    
    int main(int argc, char const *argv[])
    {
    	return foobar();
    }
    


    Дальше у вас идет некорректный код:
    Как должен работать static_cast от std::auto_ptr<Baz>* в Baz?
    Я предполагаю, что у вас там на самом деле написано:
    this->operator=(*static_cast<BazAutoPtr*>(&std::auto_ptr<element_type>(Baz_Constructor())));
    

    Что в общем тоже неопределенное поведение, потому что
    error: taking address of temporary
    static_cast объекта к типу, объектом которого он на самом деле не является.

    Выражать эта конструкция должна была видимо примерно то же, что и
    inline BazAutoPtr():std::auto_ptr<Baz>(Baz_Constructor()){}
    


    В общем, самый дельный совет тут — завязывать с кодом, в котором такое написно.
    Ответ написан
    6 комментариев