powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема
6 сообщений из 6, страница 1 из 1
Проблема
    #32459682
Мышьяк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть проблема: когда я возвращаю ссылку и указатель на объект, я предоставляю слишком многое пользователю функции. Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class Event
{
public:
    virtual void AddHandler(Handler*);
    virtual void RemoveHandler(Handler*);
    virtual void operator()();
};

class Nechto
{
public:
    virtual Event& OnDestroyNechto();
};

void f(Nechto* n)
{
    n->OnDestroyNechto()();
    //все получатели подумают, что n уничтожен, а это 
    //плохо
   
    n->OnDestroyNechto() = Event(); //это вообще нехорошо
}


Нужно как-то запретить использовать некоторые функции
...
Рейтинг: 0 / 0
Проблема
    #32460038
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вместо public: если поставить private: или protected: ?
...
Рейтинг: 0 / 0
Проблема
    #32460058
rst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или имеется ввиду следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Nechto{

private:
int count;
OnDestroyNechto();
public:
int AddRef(){
return (++count)
};
int Release(){
   --count;
 
   if (count<= 0 ) {
   OnDestroyNechto();
   delete this;return  0 ;}
return count;
};
};

на каждый указатель на объект делать AddRef и потом Release().?
...
Рейтинг: 0 / 0
Проблема
    #32461022
Мышьяк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если поставить private или protected, то доступ к этим функциям будет закрыт и для Nechto(для него должно быть всё видно)(если не будет friend, но если будет большое сущностей, которым должнен быть доступен operator(), это не подойдёт)
Можно было бы использовать const
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Event
{
public:
    virtual void AddHandler(Handler*) const;
    virtual void RemoveHandler(Handler*) const;
    virtual void operator()();
};
//...
const Event& OnDestroyNechtoEvent()
//...

Но const сюда не очень подходит по значению(скорее как раз operator() не изменяет Event)

Что имелось ввиду:
Nechto может оповещать о своём уничтожении, поэтому существует класс событие, в который можно добавлять обработчики события. Ещё у него есть operator() (вызывает все обработчики).
В Nechto существует функция, возвращающая ссылку на Event, чтобы желающие могли добавить или удалить обработчик. Но желающим становится доступным и operator()
=>они могут вызвать operator() и произойдёт ужас
...
Рейтинг: 0 / 0
Проблема
    #32461779
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажись, понял. На прошлой неделе была похожая проблема.

Делал так:

Создавал абстрактный(ну так получилось, для уверенности в детях) класс, который друг классу Event,
и в нём использовал все нужные закрытые/прикрытые методы класса Event,

потом сделал его родителем для всей кучи классов типа Nechto.
Nechto, через свои методы вызывали методы родителя, которые в свою очередь по-дружески звали методы Event.

Я правильно понял проблему? :)
...
Рейтинг: 0 / 0
Проблема
    #32462762
Мышьяк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще так можно.
Но немного не то, т.к. в этом случае доступ к закрытым членам получают те, кто наследуют от этого класса, а нужно закрывать доступ, при этом не всем, а только некоторым(и только доступ к членам не всех объектов типа Event, а только тех, указатели на которые возвращаются функциями Nechto)
Ну можно так сделать:
Код: plaintext
1.
2.
3.
class RestrictedEvent : public Event
{
    using Event::operator();
};

Но тогда Event* в RestrictedEvent* не преобразуется неявно, а, преобразовав обратно(уже можно неявно), мы получаем доступ к operator()

Можно ещё так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class RestrictedEvent : public Event
{
    Event* myEvent;
public:
    RestrictedEvent(Event* e) : myEvent(e) {}
    
    virtual void AddHandler(Handler* h) { myEvent->AddHandler(h); }
    virtual void RemoveHandler(Handler* h) { myEvent->RemoveHandler(h); }
    virtual void operator()() { throw  "Так нельзя" ; }
};


Я бы может так и делал, если бы не проблемы:
1. надобность в выделении памяти для RestrictedEvent(если возвращать указатель, если возвращать по значению, этой проблемы не будет, но будет потеря гибкости)
2. а если мне надо заблокировать другую функцию, то всё переписывать
хотя можно в конструкторе передавать массив указателей на запрещённае функции-члены и проверять всё время.
Но если появится ещё класс с такой же проблемой, то что делать, непонятно.
Т.е. переписывать.
Хотелось бы как-нибудь шаблонами, чтобы restrict<Class, forbidden_func>
Но как это сделать(и можно ли), не знаю <:80~
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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