Ответы пользователя по тегу C++
  • Компиллятор теряет реализацию метода в библиотеке

    @Door
    сделайте
    extern "C" inline IMercatorMap* Create(bool SmoothZoom)
    {
        return new MercatorMap(SmoothZoom);
    }
    
    Ответ написан
  • Едино разовое объявление структуры в проекте

    @Door
    Не «описание» и «описание», а объявление (declaration) и определение (definition).
    Если у Вас есть тип (struct blah) и Вам нужен один экземпляр (instance) (в Вашем случае test_blah) этого типа, к которому нужно иметь доступ с любой точки программы, то Вам нужно один раз определить этот экземпляр (больше, конечно же, не получится, ODR. Определить — написать полное имя типа, указав имя переменной в одной единице трансляции), а перед использованием объявить, предварительно указав, что переменная (экземпляр) является «внешней» (extern) по отношению к текущей единице трансляции (обычно, это отдельный .cpp файл после препроцессора).

    В итоге, у Вас есть, грубо говоря, 2 единици трансляции (blah.c, main.c). Нужно определить переменную в любой из них (в точке, конечно же, когда тип переменной определён, а не объявлён). И, для удобства (чтобы потом просто подключать заголовочный файл, а не каждый раз писать одно и то же) объявить переменную в blah.h, и подключая blah.h в любой, нужный .cpp файл, использовать её. Т.е.:

    1. // blah.h
    2.  
    3. #ifndef BLAH_H
    4. #define BLAH_H
    5.  
    6. // Объявляем и определяем тип (можно только объявить, а определить в другом месте)
    7. struct blah
    8. {
    9.     int value;
    10. };
    11.  
    12. // Объявляем переменную, указав, что она определена в другом месте
    13. // (Поскольку в данной точке мы имеем полное определение типа,
    14. // можно объявить blah_test типа struct blah, а если бы определение
    15. // находилось в другом месте (т.е. имели бы просто struct blah; выше), то пришлось бы
    16. // объявлять указатель на struct blah, т.е. struct blah*)
    17.  
    18. extern struct blah blah_test;
    19.  
    20. #endif
    21.  
    22. // ---------------------------------
    23. // blah.cpp (blah.c)
    24.  
    25.  
    26. #include "blah.h"
    27.  
    28. // Определяем переменную
    29. struct blah blah_test;
    30.  
    31. // ---------------------------------
    32. // main.cpp (main.c)
    33.  
    34. // Подключая заголовочный файл, объявляем переменную,
    35. // которую хотим использовать.
    36. #include "blah.h"
    37.  
    38. int main()
    39. {
    40.     // Используем
    41.     blah_test.value = 0;
    42.  
    43.     return 0;
    44. }
    45.  
    46.  
    Ответ написан
    1 комментарий
  • Проблемы сборки?

    @Door
    может быть это связано с зарезервированным словом interface, которое в ObjBase.h определено как
    #define __STRUCT__ struct
    #define interface __STRUCT__
    

    Мне кажется, где-то пропустили, не включили <Windows.h>
    Ответ написан
    1 комментарий
  • Что подразумевает C++ класс с private конструктором и парным auto_ptr?

    @Door
    Думаю, в первом случае, лучше всего будет вернуть просто foo_Bar_t (зависит от того, что внутри foo_Bar_t).
    А второе — бредятина полная: нельзя наследоваться от std:auto_ptr… В std:auto_ptr не переопределён оператор взятия адреса (operator&) и приведение типа std:auto_ptr<Baz>* в Baz — не должно скомпилироваться. И если уже писать такой бред, то, наверное, лучше сделать так:
    inline BazAutoPtr::BazAutoPtr()
    {
        reset(Baz_Constructor());
    }
    
    Ответ написан
  • Перегрузка логических операторов?

    @Door
    можете определить только 2 оператора < и ==, и использовать namespace std::rel_ops в котором есть определения операторов !=, >, <=, >=. Оно?
    Ответ написан
    5 комментариев
  • С чего начать изучение C++?

    @Door
    Не надо сначала Страуструпа, он крут, конечно же, но для начала лучше что-то попроще — очень понравилась Лафоре (та, что в комментариях) — она не очень толстая, в отличии от Страуструпа и выложено в более доступной форме.
    Ответ написан
    Комментировать
  • Visual Studio with Qt always rebuilds solution?

    @Door Автор вопроса
    обновил содержание, есть решение.
    Ответ написан
    Комментировать
  • Размер файла на диске используя iostream

    @Door
    Может быть ещё нужно:
    #include <Windows.h>
    
    typedef unsigned long long int file_size_t;
    
    // Return 0 if fail
    inline file_size_t FileSize(LPCTSTR fileName)
    {
    	file_size_t size = 0;
    
    	HANDLE file = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,
    		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	if(file != INVALID_HANDLE_VALUE)
    	{
    		LARGE_INTEGER fileSize = {};
    		if(GetFileSizeEx(file, &fileSize))
    		{
    			size = ((static_cast<file_size_t>(
    				fileSize.u.HighPart) << 32) | fileSize.u.LowPart);
    		}
    	}
    	return size;
    }
    
    Ответ написан
    Комментировать
  • Можно ли обойтись без виртуального наследования?

    @Door
    Нет, нельзя.
    Это как пытаться не применять ключевое слово virtual для указания того, что данный метод — виртуальный.
    Т.е. у Вас есть все условия для применения виртуального наследования — и это не костыль — без его применения — вот это костыль.
    Не нравится виртуальное наследование — передумайте свою иерархию классов.
    Ответ написан
    Комментировать