Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11

Указатели в MFC

26.11.2009, 23:04. Показов 2564. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте!
Подскажите пожалуйста....вот допустим при кодинге на MFC при создании объекта создаём указатель на него....но почему нельзя просто объект создать на тип..а именно указатель......в некоторых ситуациях создаётся просто объект на тип..объясните в чём разница?...Я знаю что указатель содержит в себе адрес объекта!
заранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.11.2009, 23:04
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++,...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

18
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
29.11.2009, 12:40
Если я правильно понял вопрос вы пытаетесь понять в чем разница между
C++
1
2
CComeMFC_Class c_var();
CComeMFC_Class* c_ptr = new CComeMFC_Class();
Никакой, кроме того в какой области памяти они будут храниться. Это скорее вопрос вкуса и/или стиля программирования.

Второй метод, правда, проигрвает немного в скорости доступа к членам класса из-за дополнительного разименования. Но это уже относится к вопросу использования объекта , а не его создания.
0
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
30.11.2009, 09:40  [ТС]
Спасибо за ответ ...очень благодерен....
Можно ещё кое-что утонить?
Вот в книжках описывется...точнее у меня в книге...по Visual C++...
C++
1
2
3
4
5
6
7
8
9
10
#include <afxwin.h>
#include 'mainFrm.h'
CMainFrm::CMainFrm()
{
 Create(NULL, 'An MFC Application Template');
}
 BOOL CTemplateApp::InitInstance()
{
 m_pMainWnd=new CMainFrm;
m_pMainWnd->ShowWindow(m_nCmdShow);
а можно же написать:
C++
1
2
CMainFrm m_pMainWnd;
m_pMainFrm.ShowWindow(m_nCmdShow);
То есть это 2 корректных доступа к объекту?...И как я понял ваш ответ...разница лишь в памяти..где они хранятся.......так а зачем тода ваще указатели на объекты создавать...если можно просто объектом пользоваться....или указатели удобней?
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
30.11.2009, 17:26
Да, это два корректных способа доступа к объектам в C++.
Какой-то особой причины для использвания указателей я не знаю. Повторюсь - это всего лишь вопрос вкуса и стиля программирования.
0
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
30.11.2009, 17:41  [ТС]
Большое за спасибо за ответ....вы облегчили мои страдания...а то в книгах это не очень ясно написано..особенно если читаешь кодинг под виндой....там даётся тока код и объяснени о том как он работает....но почему именно так ....не пишут....
А вы пишете на С++?
Я вообще писал на чистом API....вот хочу перестроиться на классы....хотелось бы на Buildere писать...но по этой среде мало книжек......да и в Visual C++ мне кажется больше возможностей....!
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
30.11.2009, 18:33
Да, я пишу на С++ в среде Visual Studio .NET 2002
MFC не использую, не нравится он мне.
С С++ Builder 3.0 работал некоторое время, мне он понравился. Один из моих друзей, правда, жаловался, на его последние версии что там много ошибок.
Насчет того в Visual C++ больше возможностей чем в C++ Builder не соглашусь. Это зависит от того что и какие версии сравнивать. У этих продуктов различное позиционирование на рынке, не стоит об этом забывать.
0
GreenEx
30.11.2009, 19:56
To bazile:

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

Что Вы имели в виду?

> Какой-то особой причины для использвания указателей я не знаю. Повторюсь - это всего лишь вопрос вкуса и стиля программирования.

Вы не видете причины использования в данном примере или, вообще, в С++ ?
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
30.11.2009, 22:32  [ТС]
GreenEx
а в чём по вашему причина использования указателя в данном примере?
Пример Сверху с классами!
Можно же просто объект создать и использовать методы класса!
0
GreenEx
30.11.2009, 23:52
Основная мотивация ООП - повторное использование кода.
Т.е. создавая класс однажды, Вы стараетесь сделать его максимально(в разумных пределах) универсальным для повторного использования.
В данном примере Вы можете повторно использовать класс CTemplateApp, но уже не с CMainFrm, а с некоторым другим классом CMyMainFrm, производным от CMainFrm. Для этого понадобиться всего-лишь отнаследовать от CTemplateApp новый класс CMyTemplateApp и переопределить в нем всего один метод:
C++
1
2
3
4
5
6
BOOL CMyTemplateApp::InitInstance()
{
  m_pMainWnd = new CMyMainFrm;
  m_pMainWnd->ShowWindow(m_nCmdShow);
  .........................
}
Но данный в Вашей книге пример не достаточно универсален. Я бы сделал это так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class TFrame>
class CTemplateApp
{
public:
  TFrame m_pMainWnd;
 
  BOOL InitInstance()
  {
    m_pMainWnd = new TFrame;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    .........................
  }
};
Теперь мы можем использовать как CMainFrm, так и CMyMainFrm, вообще, ничего не переделывая просто определяя, какой класс окна хотим использовать:

CTemplateApp<CMainFrm> App; - аналогичен Вашему примеру с CMainFrm
или
CTemplateApp<CMyMainFrm> App; - аналогичен моему примеру с CMyMainFrm

Универсально?
На этом основан другой (отличный от MFC) враппер над Win32API, который я и советую Вам (как и всем другим) использовать вместо MFC.

И еще об указателях. Любой статически создаваемый объект занимает место в секции .data, что увеличивает размер исполняемого файла. Иногда статическое (или в стеке) создание экземпляров бывает вредно и даже опасно для программы. В этих случаях создание не через new запрещают семантическим путем.
GreenEx
30.11.2009, 23:55
Забыл указать рекомендуемый мной враппер... :о)
Это WTL. Информацию о нем по-русски можно почитать на rsdn.ru вразделе 'Статьи'
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
01.12.2009, 00:26  [ТС]
Как я вас понял......указатель на объект создают тода...если я буду часто ссылаться через указатель на данные........А если временная переменная.....ну я имею ввиду допустим один раз вызвать функцию..то можно просто объект создать....
Или до меня не дошло? )
0
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
01.12.2009, 00:27  [ТС]
Как я вас понял......указатель на объект создают тода...если я буду часто ссылаться через указатель на данные........А если временная переменная.....ну я имею ввиду допустим один раз вызвать функцию..то можно просто объект создать....
Или до меня не дошло? )
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
01.12.2009, 09:53
2J-Tosha:
Я забыл еще про один момент. Это время существования объекта. Объект созданный как переменнная CComeMFC_Class c_var() будет существовать только в пределах охватывающего его блока, а объект созданный через new будет существовать до момента явного вызова деструктора в программе. Поэтому вот этот код наверняка вызовет ошибку:[code]BOOL CTemplateApp::InitInstance()
{
CMainFrm m_pMainWnd;
m_pMainFrm.ShowWindow(m_nCmdShow);
}[code]Т.к. C++ автоматически вызовет деструктор класса CMainFrm в конце функции InitInstance.
0
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
02.12.2009, 00:46  [ТС]
Я прошу прощения.....у мен ещё возник вопрос....
какая разница между этими предложениями:
C++
1
2
3
YouClass your;
Myclass *one;
one=&your;
и этим
C++
1
2
YouClass your;
Myclass *one=new your;
ведь оба означают взятие адреса....но в чём отличие...и кода какой метод надо использовать?
0
0 / 0 / 1
Регистрация: 26.08.2009
Сообщений: 12
03.12.2009, 13:26
Code
1
2
3
4
5
6
7
8
1
YouClass your;
Myclass *one;
one=&your;
 
2
YouClass your;
Myclass *one=new your;
В обоих случах Myclass должен быть родителем для YouClass (иначе просто указатели не преобразуются) - это раз.
Второе: второй пример просто неверен синтаксически. (после оператора new должено стоять имя типа, т.е. запись
Code
1
Myclass* one = new YouClass
еще может быть верной, но при условии, что YouClass потомок Myclass).
Третье: (при учете что все написано правильно) в первом случае при выходе из функции перемення one будет указывать на несуществующий объект, тогда как во втором случае объект создается в куче, кот. не имеет никакого отношения к стеку.
0
GreenEx
03.12.2009, 15:49
> В обоих случах Myclass должен быть родителем для YouClass (иначе просто указатели не преобразуются)

Я бы не был столь категоричен. Вот например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Myclass;
class YouClass
{
public:
    Myclass* operator&() { return 0; }
};
 
int main()
{
    YouClass your;
    Myclass *one;
    one=&your;
}
> тогда как во втором случае объект создается в куче, кот. не имеет никакого отношения к стеку.

Это, надеюсь, не камень в мой огород?
Или мне объяснить про стек и кучу?
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
04.12.2009, 23:44  [ТС]
Хорошо....тода вот другой пример:
C++
1
2
CButton but;
CStatic stat;
и
C++
1
2
CButton *but;
CSatic *stat;
в каких случаях создаётся указатель....а в каких просто объект?
0
GreenEx
05.12.2009, 20:02
Я бы настоятельно рекомендовал заняться изучением С++. Изучением по книге, а не в форуме, а то это начинает напоминать прием родов по телефону.
На данном этапе подойдет любая книга по С++, но я рекомендую классику - Страуструп.
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
05.12.2009, 23:49  [ТС]
Я конечно извиняюсь...но я читал книги по С++....читал про указатели....но вся проблема в том что кода читаешь книгу для винды...там не объсняется почему создаётся указатель на то то...то то...там просто говорится..создаётся указатель....то есть так и надо....но хотелось бы всё равно узнать суть....почему именно так...а не подругому.....вот поэтому я и решил обратитья за помощью...и спросить в этом форуме! У меня есть третье издание Страуструпа...я бы не назвал эту книгу классикой.....там всё СЛИШКОМ загружено....я понимаю что он автор этого языка..но у него не правильный подход к изложению материала....
С++ я освоил(правда не весь)...с помощью книжки Р.Лафоре Classic Computer Science....мне она очень понравилась!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2009, 23:49
Помогаю со студенческими работами здесь

В matlab есть указатели на переменные или что-нибудь похожее на указатели?
Здравствуйте, в matlab есть указатели на переменные? или что-нибудь похожее на указатели? нужно хранить в объекте информацию: на...

Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком
Смысл задания в том, что нужно отсортировать массив структур из 3х полей по сумме координат есть структура struct XYZ{ ...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Указатели на указатели: для чего они могут понадобятся?
Изучаю C++, дошёл до указателей на указатели. Там пишут что эта тема не обязательна. Для чего они могут понадобятся?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru