Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
[C++] А к ф-ям 01.06.01 14:12 Число просмотров: 806
Автор: myrmidon Статус: Незарегистрированный пользователь
|
ну это да, но если писать CMyClass class; class.MyFunc();
То происходит ошибка :
error C2248: 'CMyClass::CMyClass' : cannot access protected member declared in class 'CMyClass'
Вот я и спрашиваю, как получить доступ к ф-циям
|
<programming>
|
[C++] Как получить доступ к функциям класса если... 01.06.01 13:00
Автор: myrmidon Статус: Незарегистрированный пользователь
|
если конструктор этого класса объявлен в разделе протектед
|
|
Обычно это делается... 01.06.01 13:57
Автор: PS <PS> Статус: Elderman
|
что бы ты не смог сам создать объект. Для этого предоставляется статик функция. Посмотри внимательно и подумай зачем разработчики пытались отгородить тебя от "ручного" создания объектов.
|
| |
А к ф-ям 01.06.01 13:59
Автор: PS <PS> Статус: Elderman
|
класса (public) ты доступ имеешь, не зависимо от того где у тебя расположен конструктор.
|
| | |
[C++] А к ф-ям 01.06.01 14:12
Автор: myrmidon Статус: Незарегистрированный пользователь
|
ну это да, но если писать CMyClass class; class.MyFunc();
То происходит ошибка :
error C2248: 'CMyClass::CMyClass' : cannot access protected member declared in class 'CMyClass'
Вот я и спрашиваю, как получить доступ к ф-циям
|
| | | |
Правильно 01.06.01 14:52
Автор: PS <PS> Статус: Elderman
|
не можешь создать объект класса.
Как тебе уже написали, либо создай свой класс производный от этого, либо подумай зачем от тебя это скрыли (мой вариант мне кажется наиболее правильным).
|
| | | |
[C++] см. самый первый реплай 01.06.01 14:35
Автор: XR <eXtremal Research> Статус: The Elderman
|
> ну это да, но если писать CMyClass class; class.MyFunc(); > То происходит ошибка : > error C2248: 'CMyClass::CMyClass' : cannot access protected > member declared in class 'CMyClass' > > Вот я и спрашиваю, как получить доступ к ф-циям
class CMyClass {
protected:
CMyclass();
public:
void MyFunc();
}
class NewClass : public CMyClass {
public:
NewClass();
void MyFunc();
}
NewClass _class; _class.MyFunc();
Так понятнее ?
|
| | | | |
[C++] [C++] см. самый первый реплай 01.06.01 15:28
Автор: myrmidon Статус: Незарегистрированный пользователь
|
мляя, сделал так , парадокс, но функции выполняются, но не выполняется то что внутри функции.
|
| | | | | |
...давай весь код в студию - бум лечить :))) 01.06.01 16:37
Автор: XR <eXtremal Research> Статус: The Elderman
|
|
| | | | | |
:))) 01.06.01 16:19
Автор: PS <PS> Статус: Elderman
|
Чей код базового класса ?
Исходник есть ?
Я же тебя предупреждал - разберись сначала. Возможно при конструировании объекта устанавливается какая-та переменная, а в ф-ях она проверяется.
|
| | | | | | |
:))) 01.06.01 19:21
Автор: kabanchik Статус: Незарегистрированный пользователь
|
Я кажется догадываюсь как он сделал.
XR дал такой кусок :
class CMyClass {
protected:
CMyclass();
public:
void MyFunc();
} ;
class NewClass : public CMyClass {
public:
NewClass();
void MyFunc();
} ;
он наверное буквально все воспринял
так вот, тут достаточно сделать вот так
class NewClass : public CMyClass
{
public:
NewClass();
};
видимо он еще и вписал ф-ию MyFunc(); в результате ф-ия перегрузилась, и не выполняет то что надо.
myrmidon, то что PS хотел сказать - это посмотри, имеет ли твой класс нечто похожее на это:
class CMyClass
{
protected:
CMyClass();
public:
static CMyClass* CreateMyClass();
public:
void MyFunc();
};
если есть, то его следует вызвать так:
CMyClass *ptrMyClass = CMyClass::CreateMyClass();
ptrMyClass->MyFunc();
delete ptrMyClass;
или, опять таки, если есть такая ф-ия:
CMyClass::DestroyMyClass(ptrMyClass);
опять таки, при желании можно и приват ф-ию вызвать:))) но только для чего класс преднозначен и почему скрыт конструктор, это тебе видней. или кинь куски исходника сюда. ребята подскажут.
|
| | | | | | | |
:))) 01.06.01 20:09
Автор: myrmidon Статус: Незарегистрированный пользователь
|
Я немного разобрался с классами, функции выполняются, но то что внутри функции нет,
Немного объесню, класс к примеру образован от CListView, я сделал ListControl и хочю вызывая свои функции управлять этим лист контролом ну типа добавить строку При вызове, походу m_hWnd окна не тот что надо и в итоге функции класса CListCtrl не пашут
|
| | | | | | | | |
[C++] Ещо подробнее... 01.06.01 20:16
Автор: myrmidon Статус: Незарегистрированный пользователь
|
Для получения лист контрола вызывается GetListCtrl(), который вот что делает: return(CListCtrlthis; тоесть this получаеца на текущее окно, а не на окно с лист контролом
Пробывал делать так:
CMyClass *ptr = (CMyClass *)GetActiveView();
ptr->MyFunc();
Работает, но только с активным окном, можно конечно каждый раз вызывать SetActiveView но в рез-те получаеца не красиво, короче надо как-то по другому
|
| | | | | | | | | |
[C++] [C++] Ещо подробнее... 02.06.01 04:37
Автор: + <Mikhail> Статус: Elderman
|
> Для получения лист контрола вызывается GetListCtrl(), > который вот что делает: return(CListCtrlthis; тоесть ne ponimau zachem ty vozvracheesh object a ne pointer na nego?
1.
return(CListCtrlthis; // vot sdes u tebia konstruiruetsia novyi object, tebe eto nado?
2.
esli function returns this zachem tebe nuzhna eta function ?
class Cobj: Cbase
{
// labuda . . .
};
// . . .
Cobj *obj, *copyobj, obj2, *copyobj2;
Cbae *base;
obj = new Cobj();
copyobj = obj;
copyobj2 = &obj2;
// ili esli nuzhen base togda
base = (Cbase*) obj;
// . . .
delete obj;
|
| | | | | | | | | | |
пояснение 02.06.01 05:19
Автор: kabanchik Статус: Незарегистрированный пользователь
|
> > Для получения лист контрола вызывается GetListCtrl(), > > который вот что делает: return(CListCtrlthis; > тоесть > ne ponimau zachem ty vozvracheesh object a ne pointer na > nego? >
>1. return(CListCtrlthis; // vot sdes u tebia konstruiruetsia novyi object, tebe eto nado?
>2. esli function returns this zachem tebe nuzhna eta function ?
на самом деле - это из MFC. там написано так
class CListView
{
public:
CListCtrl& GetListControl() const;
};
CListControl& CListView::GetListControl() const
{
return(CListControlthis;
}
так что тут он и поменять то не сможет :-)))
да и объект не дублируеться.
|
| | | | | | | | | |
[C++] Ещо подробнее... 02.06.01 02:34
Автор: kabanchik Статус: Незарегистрированный пользователь
|
> Для получения лист контрола вызывается GetListCtrl(), > который вот что делает: return(CListCtrlthis; тоесть > this получаеца на текущее окно, а не на окно с лист > контролом все правильно. так и должно быть. если ты заметил, в предыдущем примере, насчет ListBox, я укзал Window Class Name == "LISTBOX".
а тут он List View. т.е. твой оконный объект принадлежит какому то классу окна. в данном случае List View (или более понятно - List Control)
и конвертируя ListView => LictControl, ты ничего не теряешь.
можно так же и обратно пойти
допустим где то написал:
CListCtrl& crtlList = GetListControl();
................................
CListView *pView = (CListView*)&crtlList;
я серьезно не вижу в чем проблема? максимум ты где то путаешься в virtual ф-иях. но где, не имею понятия. хочешь подкинь побольше кода , чтоб понятней было). или сделай демку в которой проявляются ошибки (с комментариями) и вышди на flashmail@rambler.ru ... только не забудь zip-нуть :-))))
|
| | | | | | | | | | |
Объесняю в чом проблема 02.06.01 11:41
Автор: myrmidon Статус: Незарегистрированный пользователь
|
Я имею класс , порождённый от CCtrlView
У меня нету в ресурсах лист контрола, я его создаю в окне с помощью этого класса. Но окно не простое, а со сплиттерами, тоесть есть ещё пару окон,
Для получения доступа к лист контролу есть функция GetListCtrl(()
которая работает с учетом this - ну тоесть CWnd *wnd
В проге активным может быть только одно окно. а я вызываю функцию обработки для другого окна, в результате this , необходимый для функции GetListCtrl() получается другого окна, и соответственно все методы для лист контрола не выполняются
Пр отладке, можно заметить что при активном окне в котором лист контрол this имеет значение CMyListCtrl hWnd = 0x00000ccc
А при активном другом окне this имеет значение COtherWindow hWnd = ???
COtherWindow - класс другого окна
Видно что при активизации разных окон происходит бред с this
И ещо, можно написать так: CMyListCtrl *ptr = (CMyListCtrl *)GetActiveWindow();
ptr->Вызов любого метода для лист контрола(); - рабатает хорошо, но только если окно CMyListCtrl активировано
GetActiveWindow() возвращет указатель на класс CWnd
Короче в итоге надо получить указатель на CWnd для окна CMyListCtrl и все проблемы решатся!
|
| | | | | | | | | | | |
Объесняю в чом проблема 02.06.01 18:27
Автор: kabanchik Статус: Незарегистрированный пользователь
|
> Я имею класс , порождённый от CCtrlView > У меня нету в ресурсах лист контрола, я его создаю в окне с > помощью этого класса. Но окно не простое, а со > сплиттерами, тоесть есть ещё пару окон, hmmmmmmmmm ....
ну вот, сам и предложил решение.
если ты используешь сплитер, и к тому же знаешь порядок расположения окон, тоды какие проблемы
есть ф-ия
CWnd* CSpliterWnd::GetActivePane(int* pRow = NULL, int* pCol = NULL);
и
CWnd* CSpliterWnd::GetPane( int row, int col );
если знаешь местонахождение окна (т.е. row / column), то легко получишь указатель на нужный View. тут ты можешь получить координаты активного View, если это не "твое" окно, то получить нужное. или сразу получить то что интересует.
если у тебя MDI приложение, то сделай полегче, зачем возиться - в MianFrameWnd держи указатель на нужное окно или фрейм (это тебе виднее).
тут обсалютно безразлично контрол у тебя или нет. главное найти или придумать механизм получения указателя на нужное окно в любой момент времени.
|
| | | | | | | | | | | | |
[C++] Объесняю в чом проблема 03.06.01 00:45
Автор: myrmidon Статус: Незарегистрированный пользователь
|
Действительно, чо то я не подумал про GetPane :)
Всё получилось! Спасибо что подсказал!
|
|
породи класс от этого 01.06.01 13:12
Автор: vaborg <Israel Vaborg> Статус: Elderman
|
тогда ты лоучишь доступ и к конструктору и к функциям :)
|
|
|