我有两个课程:AbstractClass
和SubClass
。
这基本上是我的代码(好吧,只是一些示例代码):
abstractclass.h
class AbstractClass
{
public:
AbstractClass();
void doSomething();
protected:
virtual void implementMe() = 0;
int a;
};
abstractclass.cpp
#include "abstractclass.h"
AbstractClass::AbstractClass(){}
void AbstractClass::doSomething()
{
implementMe(); // compiler error: "implementMe() was not declared in this scope"
a = 0; // same compiler error here...
}
subclass.h
#include "abstractclass.h"
class SubClass : public AbstractClass
{
public:
SubClass();
protected:
void implementMe();
};
subclass.cpp
#include "subclass.h"
SubClass::SubClass() {}
void SubClass::implementMe()
{
// do some stuff
}
然而,在AbstractClass
中,我不断收到编译器错误(对于虚函数以及类变量):
implementsMe()未在此范围内声明
我发现摆脱这种情况的唯一方法是使用前向声明:
void implementMe();
AbstractClass::doSomething()
{
implementMe();
}
我不敢相信这是正确的方法吗?
谢谢!
好的,因为我对C++
中的子类化的概念性理解似乎并不完全错误(请参阅注释),我将分享一些原始的源代码。希望这有助于识别错误。
这是我的抽象/基类:
abstractenvironment.h
#ifndef ABSTRACTENVIRONMENT_H
#define ABSTRACTENVIRONMENT_H
#include <QObject>
class AbstractEnvironment : public QObject
{
Q_OBJECT
public:
AbstractEnvironment(QObject *parent = 0);
protected:
virtual void process() = 0;
quint32 counter;
private slots:
void handleTimeout();
};
#endif // ABSTRACTENVIRONMENT_H
abstractenvironment.cpp
#include "abstractenvironment.h"
#include <QTimer>
QTimer *myTimer;
AbstractEnvironment::AbstractEnvironment(QObject *parent) :
QObject(parent)
{
myTimer = new QTimer(this);
connect(myTimer, &QTimer::timeout, this, &AbstractEnvironment::handleTimeout);
myTimer->start(1);
counter = 0;
}
void handleTimeout()
{
process();
counter++;
}
这是我的子类:
environment.h
#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H
#include "abstractenvironment.h"
class Environment : public AbstractEnvironment
{
Q_OBJECT
public:
Environment(Controller *controller, QObject *parent = 0);
protected:
void process();
};
#endif // ENVIRONMENT_H
environment.cpp
#include "environment.h"
Environment::Environment(Controller *controller, QObject *parent) :
AbstractEnvironment(controller, parent) {}
void Environment::process()
{
// do something
}
PS:我从这个问题的第一部分开始学习并试图用MinGW在Qt里面编译上面的源代码。我收到两条错误消息(正如预期的那样):
..\untitled\abstractenvironment.cpp: In function 'void handleTimeout()':
..\untitled\abstractenvironment.cpp:17:13: error: 'process' was not declared in this scope
..\untitled\abstractenvironment.cpp:18:5: error: 'counter' was not declared in this scope
如果您想自己尝试一下,我已经将Qt项目压缩并将uploaded压缩到我的Dropbox(当然我会在某些时候删除此文件,但代码与上面的帖子 - &gt;它只是为了方便起见,所以你不必自己复制粘贴它)
答案 0 :(得分:6)
原始回答:
implementMe(); // compiler error: "implementMe() was not declared in this scope"
这是因为在AbstractClass中没有正确声明doSomething()。你&#34;宣布&#34;它在基类中:
doSomething();
编译器无法识别AbstractClass :: doSomething()的行外定义,因此实现中的任何内容都不会解析为类作用域。
将其更改为:
void doSomething();
就像派生类一样。
和
AbstractClass::doSomething()
{
implementMe();
}
到
void AbstractClass::doSomething()
{
implementMe();
}
更新:
void handleTimeout()
{
process();
counter++;
}
是一个全局函数。这不是类的实现。它应该是:
void AbstractClass::handleTimeout()
{
process();
counter++;
}
答案 1 :(得分:2)
在abstractenvironment.cpp
中定义void handleTimeout()
,这是非成员函数,与AbstractEnvironment
类无关。因此,它不会查找AbstractEnvironment::process()
和AbstractEnvironment::counter
,而是查找::process()
和::counter
(未声明,因此错误)。
将其更改为void AbstractEnvironment::handleTimeout()
,它应该编译。