Доступ к protected...
От: Sheridan Россия  
Дата: 19.10.04 09:31
Оценка:
В общем есть несколько классов, наследующих друг друга по определенным параметрам и представляющих объектную модель проекта. И есть гм... управляющий класс ObjectModel...
Например пара классов
class CItem 
{
 protected:
    AnsiString _name;
    /*...[skipped]...*/
    virtual void __fastcall Modify() = 0;
};
//---------------------------------------------------
class COffice : public CItem  
{
 private:
    /*...[skipped]...*/
    void __fastcall Modify();
};

и ObjectModel
class CObjectModel
{
 private:
    /*...[skipped]...*/
    void __fastcall LoadOffices();
};

Нужно из CObjectModel::LoadOffices() получить доступ к COffice::CItem::_name
Можно ли? или придется выносить _name в public раздел, что не хотелось бы...
-=RSDN@Home 1.1.4 beta 3 rev. 206=- [...]
Matrix has you...
Re: Доступ к protected...
От: MaximE Великобритания  
Дата: 19.10.04 09:34
Оценка:
Sheridan wrote:

> В общем есть несколько классов, наследующих друг друга по определенным параметрам и представляющих объектную модель проекта. И есть гм... управляющий класс ObjectModel...

> Например пара классов
>
> class CItem
> {
>  protected:
>     AnsiString _name;
>     /*...[skipped]...*/
>     virtual void __fastcall Modify() = 0;
> };
> //---------------------------------------------------
> class COffice : public CItem
> {
>  private:
>     /*...[skipped]...*/
>     void __fastcall Modify();
> };
>

> и ObjectModel
>
> class CObjectModel
> {
>  private:
>     /*...[skipped]...*/
>     void __fastcall LoadOffices();
> };
>

> Нужно из CObjectModel::LoadOffices() получить доступ к COffice::CItem::_name
> Можно ли? или придется выносить _name в public раздел, что не хотелось бы...

Пускай тогда CObjectModel::LoadOffices() угадывает имя:

class CItem
{

public:
     AnsiString guess_name() const { return _name; }

  protected:
     AnsiString _name;
     /*...[skipped]...*/
     virtual void __fastcall Modify() = 0;
};


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: Доступ к protected...
От: Sheridan Россия  
Дата: 19.10.04 09:36
Оценка:
Здравствуйте, MaximE, Вы писали:
ME>Пускай тогда CObjectModel::LoadOffices() угадывает имя:

ME>
ME>class CItem
ME>{
ME>
ME>public:
ME>     AnsiString guess_name() const { return _name; }
ME>
ME>  protected:
ME>     AnsiString _name;
ME>     /*...[skipped]...*/
ME>     virtual void __fastcall Modify() = 0;
ME>};
ME>


Так мне именно на запись нужен доступ...
-=RSDN@Home 1.1.4 beta 3 rev. 206=- [...]
Matrix has you...
Re[3]: Доступ к protected...
От: Chez Россия  
Дата: 19.10.04 09:42
Оценка:
Ссылкой
class CItem
{

public:
     AnsiString& guess_name() const { return _name; }

  protected:
     AnsiString _name;
     /*...[skipped]...*/
     virtual void __fastcall Modify() = 0;
};


Или метод Set:
class CItem
{

public:
    AnsiString GetName() const { return _name; }
        void SetName(AnsiString s) { _name = s; }

  protected:
     AnsiString _name;
     /*...[skipped]...*/
     virtual void __fastcall Modify() = 0;
};
Chez, ICQ# 161095094
Re: Доступ к protected...
От: NKZ  
Дата: 19.10.04 09:46
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Нужно из CObjectModel::LoadOffices() получить доступ к COffice::CItem::_name

S>Можно ли? или придется выносить _name в public раздел, что не хотелось бы...

Можно попробовать перенести часть логики работы в COffice, он же имеет доступ к AnsiString _name. То есть в LoadOffices вызывать что-то типа
COffice office;
office.UpdateName(name);
... << RSDN@Home 1.1.4 beta 3 rev. 0>>
Re[4]: Доступ к protected...
От: Sheridan Россия  
Дата: 19.10.04 09:50
Оценка:
Здравствуйте, Chez, Вы писали:

C>Ссылкой


C>Или метод Set:


мммм... Немножко не то... Хочется чтобы эти методы/поля были доступны только для CObjectModel... Не хочется в public для всех выносить....
-=RSDN@Home 1.1.4 beta 3 rev. 206=- [...]
Matrix has you...
Re: Доступ к protected...
От: GlebZ Россия  
Дата: 19.10.04 09:54
Оценка:
Здравствуйте, Sheridan, Вы писали:

А friend разве тебе для данного класса не катит?

С уважением, Gleb
Re[5]: Доступ к protected...
От: Chez Россия  
Дата: 19.10.04 09:59
Оценка: 4 (1)
Здравствуйте, Sheridan, Вы писали:

S>мммм... Немножко не то... Хочется чтобы эти методы/поля были доступны только для CObjectModel... Не хочется в public для всех выносить....


friend:
class CItem
{
  protected:
    AnsiString _name;
    /*...[skipped]...*/
  virtual void __fastcall Modify() = 0;

  friend class CObjectModel;
};
Chez, ICQ# 161095094
Re[5]: Доступ к protected...
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 19.10.04 10:00
Оценка: 4 (1)
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, Chez, Вы писали:


C>>Ссылкой


C>>Или метод Set:


S>мммм... Немножко не то... Хочется чтобы эти методы/поля были доступны только для CObjectModel... Не хочется в public для всех выносить....


добавить в класс CItem

friend class CObjectModel
"Что не завершено, не сделано вовсе" Гаусс
Re[2]: Доступ к protected...
От: Sheridan Россия  
Дата: 19.10.04 10:02
Оценка:
Здравствуйте, GlebZ, Вы писали:
GZ>А friend разве тебе для данного класса не катит?
Дык вот в том то и дело что я про него только гдето там слышал... Как используется? Подскажите пожалуйста...
-=RSDN@Home 1.1.4 beta 3 rev. 206=- [...]
Matrix has you...
Re[6]: Доступ к protected...
От: Sheridan Россия  
Дата: 19.10.04 10:27
Оценка:
Здравствуйте, Chez, Вы писали:
C>friend:
C>
C>class CItem
C>{
C>  protected:
C>    AnsiString _name;
C>    /*...[skipped]...*/
C>  virtual void __fastcall Modify() = 0;

C>  friend class CObjectModel;
C>};
C>

А наследовать это можно? Чтобы CObjectModel был friend и для потомков CItem.
-=RSDN@Home 1.1.4 beta 3 rev. 206=- [...]
Matrix has you...
Re[7]: Доступ к protected...
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 19.10.04 11:28
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, Chez, Вы писали:

C>>friend:
C>>
C>>class CItem
C>>{
C>>  protected:
C>>    AnsiString _name;
C>>    /*...[skipped]...*/
C>>  virtual void __fastcall Modify() = 0;

C>>  friend class CObjectModel;
C>>};
C>>

S>А наследовать это можно? Чтобы CObjectModel был friend и для потомков CItem.

да, так можно:


class A
{
    friend class F;
    int a;
};

class B: public A
{
};

class F
{
public:
    void foo(A *a)
    {
        a->a = 1;
    }
};


а вот так нельзя:

class A
{
    friend class F;
    int a;
};

class OtherFriend: public F
{
public:
    void foo(A *a)
    {
        a->a = 1;
    }
};

см. стандарт 11.4/8
"Что не завершено, не сделано вовсе" Гаусс
Re[7]: Доступ к protected...
От: Chez Россия  
Дата: 19.10.04 11:29
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, Chez, Вы писали:

C>>friend:
C>>
C>>class CItem
C>>{
C>>  protected:
C>>    AnsiString _name;
C>>    /*...[skipped]...*/
C>>  virtual void __fastcall Modify() = 0;

C>>  friend class CObjectModel;
C>>};
C>>

S>А наследовать это можно? Чтобы CObjectModel был friend и для потомков CItem.

Как любит повторять товарищ Paranoik,
Дружба не наследуется и не транзитивна.
©Бьерн Страуструп


Chez, ICQ# 161095094
Re[8]: Доступ к protected...
От: Sheridan Россия  
Дата: 19.10.04 11:35
Оценка:
Здравствуйте, sadomovalex, Вы писали:
S>а вот так нельзя:

S>
S>class A
S>{
S>    friend class F;
S>    int a;
S>};

S>class OtherFriend: public F
S>{
S>public:
S>    void foo(A *a)
S>    {
        a->>a = 1;
S>    }
S>};
S>

S>см. стандарт 11.4/8
Жаль, мне именно так и надо было... Может конечно и ошибка проектирования...
-=RSDN@Home 1.1.4 beta 3 rev. 206=- [...]
Matrix has you...
Re[6]: Доступ к protected...
От: Dmitriy Yakovlev Украина www.prof-uis.com
Дата: 19.10.04 11:37
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>Здравствуйте, Sheridan, Вы писали:


S>>Здравствуйте, Chez, Вы писали:


C>>>Ссылкой


C>>>Или метод Set:


S>>мммм... Немножко не то... Хочется чтобы эти методы/поля были доступны только для CObjectModel... Не хочется в public для всех выносить....


S>добавить в класс CItem


S>
S>friend class CObjectModel
S>


Можно вообще не трогать исходные классы, а сделать вот так:

void CObjectModel::LoadOffices()
{
    COffice office;

    struct friendly_office_t : public COffice
    {
    public:
        friend class CObjectModel;
    };

    // теперь можно обратится к защищенному методу
    ((friendly_office_t *)&office)->_name = "some ansi string";

}
Re[9]: Доступ к protected...
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 19.10.04 11:40
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Жаль, мне именно так и надо было... Может конечно и ошибка проектирования...


Так вроде б было надо

чтобы CObjectModel был friend и для потомков CItem

? CObjectModel и будет другом для потомков CItem, а вот потомки CObjectModel друзьями уже не станут без явного их указания в CItem
"Что не завершено, не сделано вовсе" Гаусс
Re[10]: Доступ к protected...
От: Sheridan Россия  
Дата: 19.10.04 11:46
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>Здравствуйте, Sheridan, Вы писали:


S>>Жаль, мне именно так и надо было... Может конечно и ошибка проектирования...


S>Так вроде б было надо

чтобы CObjectModel был friend и для потомков CItem

? CObjectModel и будет другом для потомков CItem, а вот потомки CObjectModel друзьями уже не станут без явного их указания в CItem

Дык в том то и дело что поля CItem видны из CObjectModel а поля дочерних классов от CItem из CObjectModel не видны...
protected поля...
-=RSDN@Home 1.1.4 beta 3 rev. 206=- [...]
Matrix has you...
Re[7]: Доступ к protected...
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 19.10.04 11:48
Оценка:
Здравствуйте, Dmitriy Yakovlev, Вы писали:

DY>Можно вообще не трогать исходные классы, а сделать вот так:


DY>
void CObjectModel::LoadOffices()
DY>{
DY>    COffice office;

DY>    struct friendly_office_t : public COffice
DY>    {
DY>    public:
DY>        friend class CObjectModel;
DY>    };

DY>    // теперь можно обратится к защищенному методу
DY>    ((friendly_office_t *)&office)->_name = "some ansi string";

DY>}


у этого подхода есть плюсы и минусы, которые рассмотрены здесь
Автор: _defrager
Дата: 21.09.04
"Что не завершено, не сделано вовсе" Гаусс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.