Задать вопрос
Ответы пользователя по тегу C++
  • Как удалить объект класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает.

    Тебе предстоит узнать много нового. О том, что такое неопределённое поведение. О том, что удалять опреатором delete можно только объекты созданные оператором new. О том, что обращение к полям объекта после вызова деструктора -- это неопределённое поведение, так же как и вызов деструктора больше чем один раз. О том, что это забота программиста -- следовать правилам языка, а рантайм может закрывать глаза на ошибки, а может громко кричать и завершать программу при первой же возможности.

    Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает. К нему по прежнему можно обратиться и вывести значения xy. При этом по завершению работы программы, в консоль выводится "destruct" второй раз.

    Ну а у меня твоя программа ожидаемо вылетает сразу же в месте вызова delete.

    как правильно уничтожить объект?

    Объект на стеке можно корректно уничтожить двумя способами: естественным -- выйдя из блока в котором он определён, и насильственным -- вызвав явно его деструктор и создав на его месте другой объект.
    Ответ написан
  • Как получить доступ к private полям без friend-функций?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Непонятно, в каких отношениях состоят List и Node.

    По-правильному, все поля класса должны быть приватными.

    По-правильному приватные поля должны быть приватными, а те, к которым нужен доступ извне -- публичными или защищёнными.
    Ответ написан
    Комментировать
  • Почему нельзя перегрузить оператор?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    bool& operator [] (int index) {
        return selfVector[index];
      }

    должен стать
    std::vector<bool>::reference operator [] (int index) {
        return selfVector[index];
      }
    Ответ написан
    Комментировать
  • Компиляция c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    получается mainx узнает о том что есть функция printx() на этапе линковки [mainx.o] и [printx.o]?

    Да.

    Каким образом происходит передача информации в [mainx] что функция printx() существует?

    Это работа линковщика связывать ссылки на неопределённые символы с определениями этих символов.
    В main.o в месте вызова printx ставится команда вызова, в секции символов заводится неопределённый символ printx а в секции релокаций заводится запись, связывающая команду вызова с символом:

    objdump -dr mainx.o
    ...
    0000000000000000 <main>:
       0:   55                      push   %rbp
    ...
      3a:   89 c7                   mov    %eax,%edi
      3c:   e8 00 00 00 00          callq  41 <main+0x41>
                            3d: R_X86_64_PLT32      _Z6printxi-0x4
      41:   b8 00 00 00 00          mov    $0x0,%eax
      46:   c9                      leaveq 
      47:   c3                      retq   
    ...


    readelf -a mainx.o
    ...
    Relocation section '.rela.text' at offset 0x580 contains 12 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    ...
    00000000003d  001400000004 R_X86_64_PLT32    0000000000000000 _Z6printxi - 4
    ...
    
    Symbol table '.symtab' contains 25 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
    ...
        20: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z6printxi
    ...


    В printx.o в секции символов заводится символ, ассоциированный с адресом в коде, где определена функция printx:

    readelf -a printx.cpp
    ...
    Symbol table '.symtab' contains 24 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
    ...
        14: 0000000000000000    75 FUNC    GLOBAL DEFAULT    1 _Z6printxi
    ...

    Здесь value == 0 -- потому что printx оказалась по адресу 0 в секции .text.

    Линковщик объединяет входные секции согласно скрипту линковки, после чего вставляет конечные адреса символов в места, которые ссылаются на них.
    Ответ написан
    Комментировать
  • Правильно ли перевел с C++ на BASH?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    $res=$(($res+$h1))

    лишний $ в начале.
    Ответ написан
    Комментировать
  • Как автоматизировать сборку зависимостей программы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как это решается в других проектах?

    В других проектах (обычно называемых "дистрибутивы ОС") библиотеки и заголовочные файлы помещаются в пакеты и устанавливаются стандартной командой ОС из репозитория. Велика вероятность того, что часть ваших библиотек уже представлена готовыми пакетами.
    Другие проекты (иногда называемых "построители дистрибутивов") могут по большей части состоять из рецептов сборки всяческих библиотек. См. например buildroot или yocto.
    Ответ написан
    Комментировать
  • Проблема с деструктором при использовании конструктора копирования?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Не с деструктором у тебя проблема, а с тем, что ты не выделил память для sea_name в конструкторе копирования, а просто присвоил значение указателя из копируемого объекта.
    Ответ написан
    Комментировать
  • Kак отсортировать файл имен в алфавитном порядке?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    l >> const_cast<char*>(vct[i].c_str());

    И что, даже не закралось подозрение, что что-то тут не так?
    Не делай так. Делай так: l >> vct[i]; и будет тебе счастье.
    Ответ написан
  • Как восстановить указатель на не первый базовый класс из неизвестного производного класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #include <stdio.h>
    
    class A
    {
    public:
            virtual ~A()
            {
            }
    };
    
    class B
    {
    public:
            virtual ~B()
            {
            }
    };
    
    class C
    {
    public:
            virtual void dump() = 0;
            virtual ~C()
            {
            }
    };
    
    class D: public A, public C
    {
    public:
            virtual void dump()
            {
                    printf("D: %p\n", this);
            }
    };
    
    class E: public B, public C
    {
    public:
            virtual void dump()
            {
                    printf("E: %p\n", this);
            }
    };
    
    void f(void *p)
    {
            C *pc1 = dynamic_cast<C*>((A*)p);
            C *pc2 = dynamic_cast<C*>((B*)p);
            C *pc3 = dynamic_cast<C*>((C*)p);
    
            if (pc1)
                    pc1->dump();
            else if (pc2)
                    pc2->dump();
            else if (pc3)
                    pc3->dump();
    }
    
    int main()
    {       
            D d;
            E e;
    
            printf("d: %p, e: %p\n", &d, &e);
    
            A *pa = &d;
            f(pa);
    
            B *pb = &e;
            f(pb);
    
            C *pc1 = &d;
            f(pc1);
    
            C *pc2 = &e;
            f(pc2);
    
            D *pd = &d;
            f(pd);
    
            E *pe = &e;
            f(pe);
    
            return 0;
    }
    Ответ написан
    Комментировать
  • В чем ошибка выскакивает на компиляции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    непонятная ошибка

    Что непонятного-то? Вроде отчётливо видно, что ReadFromFile использует CreateList, но функция CreateList (с таким прототипом, как в ReadFile) не определена. И ошибка не компиляции а линковки.
    Ответ написан
    Комментировать
  • Оцените код. Как можно заменить goto?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    while (size <=0)//проверка ввода
            goto check;//в случае неудачи, переход по метке check на 40 строку

    это
    if (size <= 0)
        break;


    goto mark;

    это просто continue; в первом случае и просто ничего во втором.
    Ответ написан
    Комментировать
  • Обращение к обьекту через указатель?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    objaddr = objects + (sizeof(Object)*n);

    sizeof(Object) * не нужен, это не ассемблер.
    Ответ написан
    Комментировать
  • Как исправить ошибку Debag Error?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мыслей нет, что делать не знаю

    нажать на "Прервать" и смотреть в отладчике, где этот abort(), почему он там и как программа туда попала.
    Ответ написан
    Комментировать
  • Почему не меняется адрес функции в разделе импорта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    в чем может быть загвоздка

    Твой код вообще вызывается? Отрабатывает без ошибок? Или где первая ошибка?

    CreateProcessW

    Почему ты ожидаешь, что все сознательные и используют W, а не A?
    Ответ написан
  • Как передать аргументы в асм код и запустить его в другом процессе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как лучше всего это сделать?

    Записать аргументы в память вместе с кодом, загрузить их из памяти в новом процессе по известному смещению от кода.
    Ответ написан
    4 комментария
  • Создал класс в чистом проекте С++, но при попытке выделить память под него в main ловлю неразрешенный внешний символ. Почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    cpp файл
    template <typename T>
    Tree<T>::Tree()
    {
    }

    Как по-твоему компилятор во время компиляции этого cpp файла узнает, что ты захочешь работать с Tree<int> в каком-то другом файле?
    Только если ты в этой же единице трансляции сделаешь явное инстанцирование нужных тебе типов. Иначе объектный файл, получившийся в результате копиляции этого cpp файла будет (почти) пустым.

    Если переношу реализацию конструктора и деструктора в заголовок - все работает.

    ...и это -- типовое решение этой проблемы.
    Ответ написан
    2 комментария
  • Ошибка линковки Google test, Как исправить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    unresolved external symbol
    "public: __thiscall tinyxml2::XMLDocument::XMLDocument(bool,enum tinyxml2::Whitespace)"
    referenced in function
    "public: __thiscall Primes::Primes(void)"

    как это исправить

    Если Primes -- это твой класс, а tinyxml2 -- это библиотека, которую он использует, то нужно слинковать проект GoogleTest с этой библиотекой.
    Ответ написан
    Комментировать
  • Как поймать нажатие CTRL+ALT+DEL (SetWindowsHookEx)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как поймать нажатие CTRL+ALT+DEL?

    В винде обычными средствами -- никак. Потому что это secure attention sequence. Его обрабатывает winlogon или загруженная в него GINA. Читать начиная отсюда.

    Есть какие-нибудь варианты?

    Написать и установить свою GINA.
    Ответ написан
    1 комментарий
  • Как подключить в скомпилированный файл все зависимости?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне собрать проект со всеми зависимостями в один исполняемый файл?

    Добавив -static в LDFLAGS.
    Ответ написан
    1 комментарий
  • Как обновлять текст выводимый TextOut на WinAPI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    теперь нужно выводить текст "Ожидание изображения', но как?

    Нужно стереть прямоугольник в котором находится текст и сказать, что его надо перерисовать. См.
    InvalidateRect
    Ответ написан
    Комментировать