none
Отладчик VS2015 не видит поля класса с++, который был объявлен как forward declaration в заголовочном файле

    Вопрос

  • Здравствуйте!

    Пример кода:

    ClassA.h

    class ClassAImpl;
    
    class ClassA
    {
    public:
        ClassA();
        // ... some other methods here
    
    private:
        ClassAImpl *m_classAImpl;
    };

    ClassA.cpp

    #include "ClassA.h"
    
    class ClassAImpl
    {
    public:
        ClassAImpl(int field) : m_Field(field) {}
    
    public:
        int m_Field;
        // ... other class members here
    };
    
    void ClassA::ClassA()
    {
        m_classAImpl = new ClassAImpl(123);
    }
    
    // ... etc

    Теперь, если я пытаюсь отладить этот код, то не могу посмотреть в отладчике значение поля класса ClassAImpl::m_Field. Отладчик видит класс ClassAImp, как не содержащий ни одного поля.

    Что я делаю не так?



    • Изменено Danil She 12 января 2018 г. 13:26
    12 января 2018 г. 13:19

Ответы

  • Вы отлаживаете exe-модуль, импортирующий класс из dll. Предварительное объявление типа важно для корректной сборки конкретного двоичного модуля (в Вашем случае dll), но в exe структура этого предварительно объявленного класса нигде не определена, отладчику негде ее взять, потому он и показывает лишь адрес, хранящийся в указателе.

    Вы инкапсулировали (намеренно скрыли) знание о структуре внутренних типов dll, и хотите теперь, чтобы отладчик об этом знал! Либо предоставьте это знание (переносите объявление класса в h файл и включайте его в исходный код exe), либо смиритесь с тем, что каждому модулю доступна своя порция знаний :)


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

    • Помечено в качестве ответа Danil She 24 января 2018 г. 8:14
    23 января 2018 г. 18:27

Все ответы

  • Здравствуйте.

    Информации не достаточно. Что именно Вы отлаживаете? Где main? Конфигурация отлаживаемого проекта (Debug, Release)?


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

    21 января 2018 г. 18:40
  • Конфигурация Debug.

    Вот ссылка на тестовый проект: https://1drv.ms/u/s!AlJiqC-x9K6AgQ33HHtp24Y4szWG

    Вот ссылка на скрин работы в отладчике: https://1drv.ms/i/s!AlJiqC-x9K6AgQ6t1Ofddd_3pdXL

    Пишите, если ещё что-нибудь нужно.

    23 января 2018 г. 15:34
  • Вы отлаживаете exe-модуль, импортирующий класс из dll. Предварительное объявление типа важно для корректной сборки конкретного двоичного модуля (в Вашем случае dll), но в exe структура этого предварительно объявленного класса нигде не определена, отладчику негде ее взять, потому он и показывает лишь адрес, хранящийся в указателе.

    Вы инкапсулировали (намеренно скрыли) знание о структуре внутренних типов dll, и хотите теперь, чтобы отладчик об этом знал! Либо предоставьте это знание (переносите объявление класса в h файл и включайте его в исходный код exe), либо смиритесь с тем, что каждому модулю доступна своя порция знаний :)


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

    • Помечено в качестве ответа Danil She 24 января 2018 г. 8:14
    23 января 2018 г. 18:27
  • Дополнение. Если Вы сделаете шаг с заходом отладчиком в какой-либо метод класса A (даже в конструктор), думаю он покажет Вам и структуру ClassAImpl, т.к. отладчик переключится на dll модуль. 

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

    23 января 2018 г. 18:36
  • Да, Вы правы. Спасибо за разъяснения. При заходе внутрь конструктора внутренняя структура приватного класса стала доступна.

    Но всё равно, несколько нелогичное поведение для меня. Все символы отладчику доступны (и загружены на момент отладки). Предварительное объявление типа данных нужно для корректной работы компилятора прежде всего, но в момент выполнения программы об этом типе известно всё, в том числе и его внутренняя структура. Это всё есть в символьной информации. Поэтому, повторюсь, не совсем логично.

    24 января 2018 г. 8:20
  • Символы содержат информацию о соответствии адресов функции в исполняемом модуле, их названий и номеров строк кода в исходнике, больше ничего. Понятия класса или структуры на низком уровне вообще не существует. Информацию об этом отладчик может взять только из кода.
    24 января 2018 г. 9:15