У меня очень плохое понимание наследования, и я не могу найти ответ, который ищу. Я прошу прощения за длину этого поста, но я чувствую, что должен быть очень конкретным.
У меня есть базовый класс «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
}
Вы должны указать класс для ваших методов в файле 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;
}
}
РЕДАКТИРОВАТЬ
Это ответы Я не могу понять, как получить доступ к методам и переменным 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
и снаружи.