Передача аргументов в IMPLEMENT_DYNCREATE

#c #mfc

#c #mfc

Вопрос:

MFC IMPLEMENT_DYNCREATE создает объект следующим образом

 CObject* PASCAL class_name::CreateObject() 
        { return new class_name; } 
  

Который вызывает конструктор по умолчанию. Я хотел вызвать параметризованный конструктор с настраиваемым параметром.

Есть ли какой-либо способ передать аргумент IMPLEMENT_DYNCREATE макросу? Как IMPLEMENT_DYNCREATE вызывается, кто-нибудь может объяснить, пожалуйста?

Комментарии:

1. Этот макрос создан моим Microsoft: learn.microsoft.com/en-us/previous-versions/5fsfk9dy (v =против140)

Ответ №1:

Есть ли какой-либо способ передать аргумент IMPLEMENT_DYNCREATE макросу?

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

Это ограничение не подразумевает, что вам не разрешалось предоставлять пользовательские конструкторы. Вы все еще можете это сделать и вызвать эти конструкторы в своем коде, хотя я сомневаюсь, что это делает код очень удобным для сопровождения. Платформа никогда не будет вызывать ничего, кроме конструктора по умолчанию.


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

Комментарии:

1. Спасибо за объяснение. Не могли бы вы, пожалуйста, сообщить мне, как можно вызвать параметризованный конструктор с помощью IMPLEMENT_DYNCREATE?

2. Он не может быть вызван, если только этот параметризованный конструктор не является конструктором по умолчанию. Не сразу понятно, какую проблему вы в конечном итоге пытаетесь здесь решить. Независимо от того, что это такое, способ IMPLEMENT_DYNCREATE реализации встроен в код MFC и не может быть изменен из пользовательского кода.

3. Я определил что-то вроде этого IMPLEMENT_DYNCREATE(Control, COleControl) Мне нужно передать параметр (имя некоторого приложения) в элемент управления класса на этапе построения. Я столкнулся с проблемой, чтобы сделать это.

4. Вы не можете, это так просто. У вас нет возможности предоставить этот аргумент фреймворку для использования во всех местах, где он вызывает CreateObject функцию, которая не принимает аргументов. Либо предоставьте аргументы по умолчанию для вашей реализации, на случай, если имя приложения известно во время компиляции, либо поищите другое решение проблемы.

5. Это другое решение можно найти здесь: Фабрики классов и лицензирование . К сожалению, вы не задали этот вопрос. Этот ответ отвечает на вопрос, который вы задали.