powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание ссылки на класс
13 сообщений из 13, страница 1 из 1
Создание ссылки на класс
    #34882582
smathcopm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В CViewMyClass определён экземпляр класса m_MyTree. Как правильно подобраться к функциям этого экземпляра (например к функции: SelectedItemesCount()) из другого класса?
Делаю так:
Код: plaintext
1.
2.
3.
	CViewMyClass *lpMyClass;
	int
		n2=lpMyClass->m_MyTree.SelectedItemesCount();
Проблема в том, что в определённых случаях код работает, но чаще - нет (причём работает до тех пор, пока не добавишь какую-нибудь строку совершенно не связанного с данной проблемой кода). В чём может быть моя ошибка?
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882585
smathcopm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чуть не забыл: unmanage C++ MFC, VS2005
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882586
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что значит "код не работает"?
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882591
smathcopm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. компилятор пропускает в любом случае, но после того, как, допустим, создаю новую функцию в классе, из которого пытаюсь получить доступ к m_MyTree, или объявляю новую переменную после или перед указанных строк, то выполнение функции обрывается на строке n2=lpMyClass->m_MyTree.SelectedItemesCount(). Причём в функцию SelectedItemesCount() при выполнении программа попадает, но там стабильно обрывается на первой же строчке =( "Обрывается" означает следующее: ставлю точку останова на первую строчку функции SelectedItemesCount() программа доходит до неё и, при шаге вперёд, выполнение функции прекращается без каких-либо ошибок и т.п.... сама программа остаётся работоспособной... но функция, таким образом, не работает.
Стоит убрать дописанные строчки и всё снова работает! Но вот мне это совсем не подходит. Думаю, что-то с памятью... но вот что?
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882596
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инициализация
CViewMyClass *lpMyClass;
происходит где-то?
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882602
smathcopm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, вот я и думаю, что надо бы написать CViewMyClass *lpMyClass = ...; (хотя не уверен, что надо - это ведь ссылка на класс...) Но не знаю, что надо написать вместо многоточия - чего только не пробывал... =(
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882605
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
CViewMyClass *lpMyClass = new CViewMyClass();  // создается новый класс

или

Код: plaintext
1.
CViewMyClass *lpMyClass = &anyExistedClass;  // создается указатель на уже сущ. класс

а так у вас указатель указывает в никуда.. и работать не будет
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882619
smathcopm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новый экземпляр класса мне создавать нельзя, т.к. нужно "подобраться" к текущему состоянию полей уже созданного класса. Попробовал следующее:
Код: plaintext
CViewMyClass *lpMyClass = &CViewMyClass;
не компилируется, говорит "error C2275: 'CViewMyClass' : illegal use of this type as an expression"
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882626
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smathcopmНовый экземпляр класса мне создавать нельзя, т.к. нужно "подобраться" к текущему состоянию полей уже созданного класса. Попробовал следующее:
Код: plaintext
CViewMyClass *lpMyClass = &CViewMyClass;
не компилируется, говорит "error C2275: 'CViewMyClass' : illegal use of this type as an expression"

CViewMyClass - это не объект класса, а просто тип данных, нужно взять реальный объект класса (переменную), который имеет тип CViewMyClass или CViewMyClass*
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882628
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может будет эффективнее сначала выучить C++ ?
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882636
smathcopm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конкретно этим и занимаюсь. Так-то я уже многое понимаю, но состояние безвыходности при некоторых ситуациях убивает.

Проблема не решилась. Если бы я мог где-то взять этот созданный объект я бы и вопроса не задавал. Проблема усложняется тем, что экземпляр класса был создан не мною с помощью макроса
Код: plaintext
1.
#define RUNTIME_CLASS(class_name) _RUNTIME_CLASS(class_name)
#define _RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
и для меня, пока, загадка... где он теперь хранится и как его "оттуда" взять. И так уже второй день сижу... жуть
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882652
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smathcopmКонкретно этим и занимаюсь. Так-то я уже многое понимаю, но состояние безвыходности при некоторых ситуациях убивает.

Проблема не решилась. Если бы я мог где-то взять этот созданный объект я бы и вопроса не задавал. Проблема усложняется тем, что экземпляр класса был создан не мною с помощью макроса
Код: plaintext
1.
#define RUNTIME_CLASS(class_name) _RUNTIME_CLASS(class_name)
#define _RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
и для меня, пока, загадка... где он теперь хранится и как его "оттуда" взять. И так уже второй день сижу... жуть


pDocTemplate->m_pViewClass
я ничего не смыслю в этих виндовых надстройках, поэтому если ошибусь не бейте..
Создал пустой проект, там есть строка:
Код: plaintext
1.
2.
3.
4.
5.
	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CxDoc),
		RUNTIME_CLASS(CMainFrame),       // main SDI frame window
		RUNTIME_CLASS(CxView));

значит созданный в рантайм объект попадает в конструктор объекта класса CSingleDocTemplate, который наследуется от CDocTemplate, а тот в свою очередь от CCmdTarget, который имеет в своем списке:

Код: plaintext
CRuntimeClass* m_pViewClass;        // class for creating new views

возможно это оно, можно проследить, тока лень, попробуйте типа:

Код: plaintext
CViewMyClass *lpMyClass = pDocTemplate->m_pViewClass;

если не получится, проследите, кому присваивает конструктор эти значения.
...
Рейтинг: 0 / 0
Создание ссылки на класс
    #34882672
smathcopm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tubrik, огромное Вам спасибо! А то я уже почти отчаялся...
В конечном итоге помогло следующее:

С помощью данной функции, оказалось, можно получить созданный объект:
Код: plaintext
1.
2.
3.
CConfView* CConfApp::getView(UINT idd)
{
	return m_views.GetValueAt(idd);
}

Ну а так я его получил:
Код: plaintext
1.
2.
3.
CViewMyClass
	*lpEditGroup=(CViewMyClass*)getView(CViewMyClass::IDD);
int
	n2=lpEditGroup->m_MyTree.SelectedItemesCount();

Всё-таки метод "тыка" - МЕТОД =) Буду учиться дальше, спасибо.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание ссылки на класс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]