В общем есть несколько классов, наследующих друг друга по определенным параметрам и представляющих объектную модель проекта. И есть гм... управляющий класс ObjectModel...
Например пара классов
class CObjectModel
{
private:
/*...[skipped]...*/void __fastcall LoadOffices();
};
Нужно из CObjectModel::LoadOffices() получить доступ к COffice::CItem::_name
Можно ли? или придется выносить _name в public раздел, что не хотелось бы...
Sheridan wrote:
> В общем есть несколько классов, наследующих друг друга по определенным параметрам и представляющих объектную модель проекта. И есть гм... управляющий класс ObjectModel... > Например пара классов >
> Нужно из CObjectModel::LoadOffices() получить доступ к COffice::CItem::_name > Можно ли? или придется выносить _name в public раздел, что не хотелось бы...
Пускай тогда CObjectModel::LoadOffices() угадывает имя:
Здравствуйте, Sheridan, Вы писали:
S>Нужно из CObjectModel::LoadOffices() получить доступ к COffice::CItem::_name S>Можно ли? или придется выносить _name в public раздел, что не хотелось бы...
Можно попробовать перенести часть логики работы в COffice, он же имеет доступ к AnsiString _name. То есть в LoadOffices вызывать что-то типа
Здравствуйте, Sheridan, Вы писали:
S>мммм... Немножко не то... Хочется чтобы эти методы/поля были доступны только для CObjectModel... Не хочется в public для всех выносить....
friend:
class CItem
{
protected:
AnsiString _name;
/*...[skipped]...*/virtual void __fastcall Modify() = 0;
friend class CObjectModel;
};
Здравствуйте, Sheridan, Вы писали:
S>Здравствуйте, Chez, Вы писали:
C>>Ссылкой
C>>Или метод Set:
S>мммм... Немножко не то... Хочется чтобы эти методы/поля были доступны только для CObjectModel... Не хочется в public для всех выносить....
Здравствуйте, GlebZ, Вы писали: GZ>А friend разве тебе для данного класса не катит?
Дык вот в том то и дело что я про него только гдето там слышал... Как используется? Подскажите пожалуйста...
Здравствуйте, 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";
}
Здравствуйте, sadomovalex, Вы писали:
S>Здравствуйте, Sheridan, Вы писали:
S>>Жаль, мне именно так и надо было... Может конечно и ошибка проектирования...
S>Так вроде б было надо
чтобы CObjectModel был friend и для потомков CItem
? CObjectModel и будет другом для потомков CItem, а вот потомки CObjectModel друзьями уже не станут без явного их указания в CItem
Дык в том то и дело что поля CItem видны из CObjectModel а поля дочерних классов от CItem из CObjectModel не видны...
protected поля...