我正在尝试通过使用Qt中的设计模式示例来了解虚函数的行为。
在这里,我有一个头文件,其中定义了两个类:
这是这些类的源文件。
问题是我无法从这些定义中创建或使用任何类。我收到的错误信息是:
main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl A::foo(class QTextStream &)”(?foo@A@@UEAAXAEAVQTextStream@@@Z) main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl A::bar(class QTextStream &)”(?bar@A@@UEAAXAEAVQTextStream@@@Z)
由于我对虚函数的了解不多,我认为可能需要在B类中重新声明函数,但这也没有帮助,并给我的日志添加了2个错误。
main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl B::foo(class QTextStream &)”(?foo@B@@UEAAXAEAVQStream@@@Z) main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl B::bar(class QTextStream &)”(?bar@B@@UEAAXAEAVQStream@@@Z)
书中的示例只是在声明后实现函数(在同一文件中),这似乎有效。我想知道为什么我的方法不起作用,是否有解决方法。
编辑: 项目文件使用以下设置:
我必须说,当涉及到建立、链接东西时,我并没有太多的想法,但对于一个小项目,我现在不应该需要将重点放在这些方面。由于 abclases.cpp 在 sources 中,我认为它在构建过程中被使用。
student.h 和 .cpp 与我在同一项目中进行的另一个尝试有关。它们现在没有被积极使用,下面是 main.cpp。
编辑2:更新过时的错误信息,更新abclasses.h。
在这里,我有一个头文件,其中定义了两个类:
#ifndef ABCLASSES_H
#define ABCLASSES_H
#include <QTextStream>
class A
{
public:
virtual ~A()
{
}
virtual void foo(QTextStream& out);
virtual void bar(QTextStream& out);
};
class B: public A
{
public:
void foo(QTextStream& out);
void bar(QTextStream& out);
};
#endif // ABCLASSES_H
这是这些类的源文件。
#include "abclasses.h"
void A::foo(QTextStream& out)
{
out << "A's foo" << endl;
bar(out);
}
void A::bar(QTextStream& out)
{
out << "A's bar" << endl;
}
void B::foo(QTextStream& out)
{
out << "B's foo" << endl;
A::bar(out);
}
void B::bar(QTextStream& out)
{
out << "B's bar" << endl;
}
问题是我无法从这些定义中创建或使用任何类。我收到的错误信息是:
main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl A::foo(class QTextStream &)”(?foo@A@@UEAAXAEAVQTextStream@@@Z) main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl A::bar(class QTextStream &)”(?bar@A@@UEAAXAEAVQTextStream@@@Z)
由于我对虚函数的了解不多,我认为可能需要在B类中重新声明函数,但这也没有帮助,并给我的日志添加了2个错误。
main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl B::foo(class QTextStream &)”(?foo@B@@UEAAXAEAVQStream@@@Z) main.obj:-1: 错误:LNK2001:未解析的外部符号“public: virtual void __cdecl B::bar(class QTextStream &)”(?bar@B@@UEAAXAEAVQStream@@@Z)
书中的示例只是在声明后实现函数(在同一文件中),这似乎有效。我想知道为什么我的方法不起作用,是否有解决方法。
编辑: 项目文件使用以下设置:
#-------------------------------------------------
#
# Project created by QtCreator 2015-08-23T11:53:16
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = untitled1
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
student.cpp \
abclasses.cpp
HEADERS += \
student.h \
abclasses.h
我必须说,当涉及到建立、链接东西时,我并没有太多的想法,但对于一个小项目,我现在不应该需要将重点放在这些方面。由于 abclases.cpp 在 sources 中,我认为它在构建过程中被使用。
student.h 和 .cpp 与我在同一项目中进行的另一个尝试有关。它们现在没有被积极使用,下面是 main.cpp。
#include <QCoreApplication>
#include <QTextStream>
//#include "student.h"
#include "abclasses.h"
//void finish(Student& student)
//{
// QTextStream cout(stdout);
// cout << "The following " << student.getClassName()
// << "has applied for graduation" << endl
// << student.toString() << endl;
//}
int main() {
QTextStream cout(stdout);
B bobj;
// A *aptr = &bobj;
// aptr->foo(cout);
// cout << "-------------" << endl;
// A aobj = *aptr;
// aobj.foo(cout);
// cout << "-------------" << endl;
// aobj = bobj;
// aobj.foo(cout);
// cout << "-------------"<< endl;
// bobj.foo(cout);
}
编辑2:更新过时的错误信息,更新abclasses.h。
B
类中,你必须声明被覆盖的函数。 - Some programmer dudeB
中的这些函数设为public
。 - Some programmer dude