我正在尝试在c ++中模拟部分类。但是,当我仅使用继承时就会出现问题。
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QLabel *interLabel;
QLabel *resultLabel;
bool calculated;
bool specialStart;
const QMap<QString, void(MainWindow::*)()> Operators;
// Group 1
void setResult(const QString &str);
void appendResult(const QString &str);
void prependResult(const QString &str);
void chopResult(const int &num);
void removeResult(const int &num);
void removeResult(const int &pos, const int &num);
QString getResult(const bool &chopDot = true);
void setInter(const QString &str);
void appendInter(const QString &str, const bool &autoSpace = true);
void prependInter(const QString &str, const bool &autoSpace = true);
void chopInter(const int &num);
void removeInter(const int &num);
void removeInter(const int &pos, const int &num);
QString chopInterOp(const int &num);
QString removeInterOp(const int &num);
QString getInter() const;
QString lastOp() const;
bool isBracketUnclosed() const;
bool endsWithBracket() const;
void closeAllBracket();
bool isLastOpArithmetic() const;
void replaceLastOp(const QString &str);
// Group 2
void addNumber(const QString &str);
void calculate();
void calculate(const QString &op);
void arithmetic(const QString &op);
void unarySpecial(const QString &format);
void binarySpecial(const QString &format);
void plus();
void minus();
void multiply();
void divide();
void equal();
void erase();
void dot();
void negate();
void ce();
void c();
void percent();
void sqrt();
void sqr();
void inv();
void root();
void pow();
void sin();
void cos();
void tan();
void asin();
void acos();
void atan();
void log();
void mod();
void fac();
void sinh();
void cosh();
void tanh();
public slots:
void buttonPushed();
};
这是我的课程定义(很长!) 我想将成员函数的声明分为两个函数组,分别是setResult()〜replaceLastOp()和addNumber()〜tanh()
如果我简单地使Mainwindow类继承两个类,那就太好了(然后必须声明和定义这两个类。) 但是,这是不可能的,因为第2组函数使用第1组中的函数,而第1组函数使用成员变量,包括interLabel,resultLabel等...
这是第1组中一个函数的示例
QString MainWindow::getResult(const bool &chopDot){
QString &&result = this->resultLabel->text();
if(chopDot){
if(result.back() == '.'){
this->setResult(result.chopped(1));
}
}
return result;
}
这是第2组中一个函数的示例
void MainWindow::addNumber(const QString &str){
if(this->calculated){
if(!this->getInter().isEmpty() && !this->isLastOpArithmetic())
this->setInter(this->chopInterOp(1));
this->setResult(str);
this->calculated = false;
}
else{
if(this->getResult(false) == "0"){
if(str == "0")
return;
else{
this->setResult(str);
}
}
else{
if(this->specialStart){
this->setResult(str);
this->specialStart = false;
}
else
this->appendResult(str);
}
}
}
因此,如果我使用继承来解决此问题,则必须像下面这样写
class Group1 : public MainWindow{...};
class Group2 : public Group1{...};
看起来很奇怪。 (看来父母与子女的关系是相反的) 因此,我想模拟不具有继承或仅声明式继承(如果可能)的部分类,这样我不必在MainWindow类中再次声明函数。