информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Spanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] [C++] см. самый первый реплай 01.06.01 15:28  Число просмотров: 845
Автор: myrmidon Статус: Незарегистрированный пользователь
<"чистая" ссылка>
мляя, сделал так , парадокс, но функции выполняются, но не выполняется то что внутри функции.
<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