我对继承的理解很差,我似乎无法找到我正在寻找的答案。我为这篇文章的篇幅道歉,但我觉得我需要非常具体。
我有一个基类“ProgCtl”,它可以向进程发送信号。我有一个名为“Beeper”的简单程序,它只能永远运行,发出“嘟嘟声!”每隔10秒发出一次消息我负责制作的派生类“BeepCtrl”旨在专门发送信号并对蜂鸣器程序进行更改。
我的问题是:我无法弄清楚如何从BeepCtrl中的方法访问ProgCtl的方法和变量。主要在BeepCtrl.cpp中,我必须使用ProgCtl的alive和send方法来检查进程是否存在并结束它。
是我的beep构造函数的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 :(得分:2)
您应该在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;
}
}
答案 1 :(得分:0)
修改强> 这回答我无法弄清楚如何从BeepCtrl 中的方法访问ProgCtl的方法和变量。实际的编译问题由@ 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
内外的地方。