информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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
<"чистая" ссылка>
тогда ты лоучишь доступ и к конструктору и к функциям :)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach