Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование и друзья - cannot access, проблемы проектирования 
:(
    Опции темы
bel_nikita
  Дата 16.12.2005, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Конструкторы, деструкторы и др. пропускаю, да бы не отвлекать внимания.

Абстрактный класс cPCIDSPCard объявлен, как друг для абстрактного класса cPCIDSP (такое допустимо?)
Класс cPTMCD6 : public cPCIDSPCard вызывает метод ISR() класса cDSP6415 : public cPCIDSP
Код

class cPCIDSPCard;

class cPCIDSP
{
  friend class cPCIDSPCard;
protected:
  virtual int ISR() = 0;    //!< Interrupt routine.
};

class cDSP6415 : public cPCIDSP
{
//public:
  int ISR() { return 0; };
};

class cPCIDSPCard
{
public:
  virtual INT   ISR()         = 0;  //!< Interrupt routine.
  UINT GetMaxDSP() const { return m_uMaxDsp; }  //!< Get max DSP's on the board.
protected:
  class cPCIDSP**     m_pDSP;     //!< Pointer to the DSP's array.
  UINT                m_uMaxDsp;  //!< Max DSP's on the board.
};

class cPTMCD6 : public cPCIDSPCard
{
public:
  INT ISR()
  {
    for (UINT i = 0; i < GetMaxDSP(); ++i )
      m_pDSP[i]->ISR();  // <<< error C2248: 'ISR' : cannot access protected member declared in class 'cPCIDSP' <<<
    return 0;
  }
};

Метод cPCIDSP::virtual int ISR() = 0; делать public'ом нельзя.
Сделать другом cPTMCD6 не очень smile Потом появяться другие классы производные от cPCIDSPCard и придется и их делать друзьями для cPCIDSP.



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
chipset
Дата 16.12.2005, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(bel_nikita @ 15.12.2005, 15:28)
Сделать другом cPTMCD6 не очень  Потом появяться другие классы производные от cPCIDSPCard и придется и их делать друзьями для cPCIDSP.

Ну вроде как в этом и суть -- кому нужно, тех и сделаешь друзьями.



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
bel_nikita
Дата 16.12.2005, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Я в тупик попал с этим проектированием smile Все работает, но, блин, не красиво.
Есть некая PCI плата. На этой плате есть несколько DSP. Я разбиваю на классы: создаю абстракцию для DSP и абстракцию платы. Потом конкретизирую для типа DSP и платы.
По приходу интерапта, драйвер берет метод ПЛАТА::ISR() платы. В свою очередь этот ПЛАТА::ISR() должен вызвать ISR() каждого DSP на плате.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 16.12.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(bel_nikita @ 16.12.2005, 05:28)
1) class cPCIDSPCard;

Вообще-то эта строка не нужна для объявления дружбы.

А так - сделай сделай в базовом DSP классе виртуальным метод ISR и объяви там же дружбу базовой схеме.

Что-то типа того

Код

class BaseDSP
{
     friend class BaseScheme;          
     virtual int ISR()=0;
};


class BaseScheme
{
     virtual int doISR_start(){return 0;};  //вызов ISR платы ДО обработки ISR DSP'ами
     virtual int doISR_finish(){return 0;}; //вызов ISR платы ПОСЛЕ обработки ISR DSP'ами

     protected:
     void ISR(){ //не знаю что такое ISR и DSP, но предполагаю, что
          doISR_start();  //плата может захотеть поработать как до DSP'ов
          for_each(m_dsp.begin(), m_dsp.end(), mem_fun(&BaseDSP::ISR)); 
          doISR_finish(); //так и после
     }
     vector<BaseDSP*> m_dsp;
};


class ActualDSP : public BaseDSP
{
      int ISR(){
          //something useful.  
      }
  
};

class  ActualPCICard : BaseScheme
{
    int doISR_start(){
       cout << "let's get party started!"";
    }
   int doISR_finish(){
       cout << "finish";
   }
   public:
   using BaseScheme::ISR;
};

int main()
{
   ActualPCICard p; p.ISR();
}




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 16.12.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата(Mayk @ 16.12.2005, 11:19)
А так - сделай сделай в базовом DSP классе виртуальным метод ISR и объяви там же дружбу базовой схеме.

Так я же так и сделал, но у меня не идет smile

З.Ы.: MSVC6


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 16.12.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(bel_nikita @ 16.12.2005, 17:21)

Так я же так и сделал, но у меня не идет


Нет. Ты вызываешь ф-цию из наследуемого класса, а не из базового. А дружба в с++ не наследуется.

Код

class b{
        friend class base;
        int a();
};

struct base
{
        base(){
                b* bb = 0; 
                bb->a(); //можно
        }
};


struct derived : public base
{
        derived(){
                b* bb = 0;
                bb->a();//нельзя
        }
};


Это сообщение отредактировал(а) Mayk - 16.12.2005, 13:39


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 16.12.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Правильно Mayk советует.
Дружбу надо локализовать в базовых классах.
Только чтобы было погибче, сделай в своем cPCIDSPCard защищенный хелпер (только для наследников):

Код

class cPCIDSPCard
{
   ...
protected:
    int CallISR(cPCIDSP& p) { return p.ISR(); } 
}

Тогда потомки cPCIDSPCard смогут реализовывать любые схемы опроса потомков cPCIDSP


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.