Использование методов базового класса внутри методов производного класса

У меня очень плохое понимание наследования, и я не могу найти ответ, который ищу. Я прошу прощения за длину этого поста, но я чувствую, что должен быть очень конкретным.

У меня есть базовый класс «ProgCtl», который может отправлять сигналы процессам. У меня есть простая программа под названием «Бипер», которая работает вечно, давая «гудок»! сообщение каждые 10 секунд, пока не прервано. Производный класс, который мне поручено создать, «BeepCtrl», предназначен специально для отправки сигналов и внесения изменений в программу звукового оповещения.

Моя проблема: я не могу понять, как получить доступ к методам и переменным ProgCtl из методов в BeepCtrl. Главным образом в BeepCtrl.cpp, где я должен использовать живой ProgCtl и метод send, чтобы проверить, существует ли процесс, и завершить его.

расширение ProgCtl моего звукового конструктора вообще что-то делает? Мои заметки только говорят, что это позволяет мне устанавливать значения атрибутов. Мне очень жаль. Я знаю, что это плохой этикет — пытаться задавать здесь более одного (и более широкого) вопроса, но я действительно потерян.

ProgCtl.hpp

#ifndef  PROGCTL_HPP
#define PROGCTL_HPP

#include <stdlib.h>
#include <unistd.h>
#include <string>

class ProgCtl {
private:
std::string   m_program;
pid_t         m_pid;

void          find_pid();

public:
// Constructors
ProgCtl():m_program(""),m_pid(-1){}
ProgCtl(std::string prog):m_program(prog),m_pid(-1){}
ProgCtl(char *prog):m_pid(-1) {
m_program = std::string(prog);
}
// Setters
void       setName(std::string prog);
void       setName(char *prog);
void       setPid(pid_t pid){m_pid = pid;}
// Other
bool       alive();
int        send(int sig);
int        start();
};

#endif

BeepCtrl.hpp; далек от завершения из-за этой фундаментальной проблемы

#ifndef BeepCtrl_HPP
#define BeepCtrl_HPP
#include "ProgCtl.hpp"#include <string>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <iostream>
class BeepCtrl: public ProgCtl{

public:
BeepCtrl(std::string name):ProgCtl(name){};
BeepCtrl():ProgCtl(){};
BeepCtrl(char *prog):ProgCtl(prog){};
void stop(); //if alive, send kill
void beep_faster(); //test if beeper is alive then decrement inveral
void beep_slower(); // increment interval
};
#endif

BeepCtrl.cpp

#include "BeepCtrl.hpp"
void stop() //if alive, send kill
{
//std::set_terminate(std::cerr << "terminate handler called\n");
if(alive()){//---alive and send not declared in this scope---
send(9);
}
else{
throw 0;
}
}
void beep_faster() //test if beeper is alive then decrement inveral
{
//throw if an invalid value
}
void beep_slower() // increment interval
{
//throw if an invalid value
}

0

Решение

Вы должны указать класс для ваших методов в файле cpp:

void BeepCtrl::stop() //if alive, send kill
{
//std::set_terminate(std::cerr << "terminate handler called\n");
if(alive()){//---alive and send not declared in this scope---
send(9);
}
else{
throw 0;
}
}
2

Другие решения

РЕДАКТИРОВАТЬ
Это ответы Я не могу понять, как получить доступ к методам и переменным ProgCtl из методов в BeepCtrl. Фактическая проблема компиляции была решена @ Sergi0.


Члены базового класса, которые должны быть доступны производному классу, должны быть объявлены protected и не private:

class ProgCtl {
protected:
std::string   m_program;
pid_t         m_pid;

void          find_pid();

public:
// Constructors
...
};

Защищенные имена по-прежнему недоступны извне, но дочерний класс имеет к ним доступ.

Подобное происходит, когда вы наследуете класс:

class BeepCtrl: public ProgCtl { ... }

Здесь доступ к публичным именам ProgCtl через объект типа BeepCtrl останется без изменений. Защищенные имена все еще будут защищены.

class BeepCtrl: protected ProgCtl { ... }

Здесь доступ к публичным именам ProgCtl через объект типа BeepCtrl возможно только из функций в BeepCtrl,

class BeepCtrl: private ProgCtl { ... }

Здесь любое имя ProgCtl скрыто от мест внутри BeepCtrl и снаружи.

0

По вопросам рекламы [email protected]