Форум программистов, компьютерный форум CyberForum.ru

Доступ к protected членам базового класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.76
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.11.2009, 15:16     Доступ к protected членам базового класса #1
Здравствуйте, форумчане!
Ниже приведенный код при компиляции вызывает следующую ошибку:
error C2248: 'Element::AddTo' : cannot access protected member declared in class 'Element' element.cpp 21.
Всю жизнь считал, что protected члены базового класса доступны для производных классов.
Разъясните, это я дурак, или лыжи не едут?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
 
class Element
{
public:
  virtual void Add(Element*) = 0;
 
protected:
  virtual void AddTo(Element*) = 0;
};
 
class Group : public Element
{
public:
  Group()
  : parent(NULL)
  {}
 
  void Add(Element* element)
  {
    element->AddTo(this);
  }
 
protected:
  void AddTo(Element* element)
  {
    parent = element;
  }
 
protected:
  Element* parent;
};
 
int main()
{
  return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2009, 15:16     Доступ к protected членам базового класса
Посмотрите здесь:

C++ Доступ к членам класса класса
Доступ к private членам класса C++
C++ Доступ к закрытым членам базового класса
C++ Как получить доступ к членам класса из функций
Доступ к членам класса C++
C++ Наследование классов. Доступ к данным базового класса
C++ Доступ к параметрам и функциям базового класса
C++ Шаблонный Список. не могу получить доступ к protected членам
Доступ к переменным базового класса при наследовании C++
Доступ к членам одного класса с другого C++
C++ Доступ к членам класса
C++ Доступ к закрытым членам класса(шаблона)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
01.11.2009, 15:41     Доступ к protected членам базового класса #2
Дело в том, что parent твоему классу не родной. Вот если бы ты добавлял к предку, т.е.
C++
1
this->Element::AddTo(element);
, то было бы нормально. Так что либо дружить, либо открывать интерфейс.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.11.2009, 16:28  [ТС]     Доступ к protected членам базового класса #3
Честно говоря, суть проблемы для меня осталась довольно таки туманной...
Дружить и открывать не айс.
Это получается из AddTo вызывать Add?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Element
{
public:
  virtual void AddTo(Element*) = 0;
 
protected:
  virtual void Add(Element*) = 0;
};
 
class Group : public Element
{
public:
  Group()
  : parent(NULL)
  {}
 
  void AddTo(Element* element)
  {
    element->Add(this);
    parent = element;
  }
 
protected:
  void Add(Element* element)
  {
  }
 
protected:
  Element* parent;
};
Так получается?
Как-то немного семантика страдает в этом случае. Более логично, по моему мнению, вызывать AddTo из Add.

Добавлено через 32 минуты
Как разрулить эту ситуацию?
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
02.11.2009, 20:41     Доступ к protected членам базового класса #4
В принципе, здесь нужно чётко определиться со смыслом реализуемых операций. Вот у тебя есть группа, реализующая интерфейс Element. Какую роль играет член parent, для чего он нужен? Что выполняет функция Add и что выполняет функция AddTo? Почему в Group они реализованы именно так, а не иначе? Как предполагается реализовать их в других элементах? К сожалению, из приведённого кода у меня не получилось извлечь достаточно чёткие ответы на эти вопросы. Как правило, при исчерпывающем ответе на такие вопросы всё становится ясно само собой...
Yandex
Объявления
02.11.2009, 20:41     Доступ к protected членам базового класса
Ответ Создать тему
Опции темы

Текущее время: 19:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru