让我们假设我们有一个抽象类NonEditableSuperBase,我们从中创建另一个抽象类MyBase.
第一类NonEditableSuperBase具有虚函数(非纯虚).但是,我想强制说,如果某人创建了一个派生的类MyBase,他/她必须为所提到的函数提供一个实现.
因此,我的想法是将函数定义为纯虚拟MyBase.
我的问题:鉴于它只是虚拟的,这是一个坏主意NonEditableSuperBase吗?
例:
//NonEditableSuperBase.h
class NonEditableSuperBase
{
...
public:
virtual int someMethod(); //It has an implementation, suppose {return 42;}
};
//MyBase.h
class MyBase: public NonEditableSuperBase
{
public:
explicit MyBase();
virtual ~MyBase() = default;
virtual int someMethod() = 0; //I make it pure virtual
};
//MyBase.cpp
MyBase::MyBase() : NonEditableSuperBase() { }
//Now someone creates a derived class from MyBase.
class SuperDerived : public MyBase
{
public: …Run Code Online (Sandbox Code Playgroud) 为了提高代码可读性,我想在函数内创建一个对象并按值返回它(我让编译器承担优化内存的任务)。
如果我有常规课程,我可以执行以下操作:
MyClass myFunction01()
{
MyClass theRegularObject;
//do things
return theRegularObject;
}
Run Code Online (Sandbox Code Playgroud)
所以在我的代码中我可以这样做:
MyClass myObject = myFunction01();
Run Code Online (Sandbox Code Playgroud)
但是,如果 MyClass 是 QObject 派生类(我们称之为 QObjDerivedClass),我会收到编译错误:
QObjDerivedClass::QObjDerivedClass(const QObjDerivedClass &) : attempting to reference a deleted function.
Run Code Online (Sandbox Code Playgroud)
我认为问题在于 QObject 既没有复制构造函数也没有赋值运算符QObject Doc。
作为可能的解决方案,我认为有以下几种,但也许我缺少更好的解决方案?
1.在main中创建对象并将该对象作为函数的引用传递
void myFunction01(CMyClass &theObj) {//do things}
//In my program
CMyClass myObj;
myFunction01(myObj);
Run Code Online (Sandbox Code Playgroud)
2.在函数内部创建一个动态对象并返回一个指针(智能指针?)
QSharedPointer<CMyClass> myFunction01()
{
QSharedPointer<CMyClass> p_theObj(new CMyClass);
//do things
return p_theObj;
}
//At my program
QSharedPointer<CMyClass> p_myObj = myFunction01();
//When p_myObj goes out of scope the CMyClass object …Run Code Online (Sandbox Code Playgroud) 我正在使用Qt 5.7(C ++)。
在一个类的cpp文件中,我使用一个匿名名称空间来创建一个类(某些实用程序),该类将仅在该文件中使用。
但是,如果实用程序类是从Qt类派生的,则会出现链接错误。我认为问题出在Q_OBJECT宏上,如果我不添加它,我不会得到错误。但是在任何Qt派生类中都必须/建议使用Q_OBJECT宏。
如何避免这种情况? 还有其他方法可以使实用程序类具有文件作用域吗?
显示错误的简单示例:CMyClass类使用从QWidget派生的实用工具类(名为CUtility)。
谢谢。
CMyClass.h
class CMyClass
{
public:
CMyClass();
void someMethod();
};
Run Code Online (Sandbox Code Playgroud)
CMyClass.cpp
#include <QtWidgets>
#include "CMyClass.h"
namespace
{
class CUtility : public QWidget
{
Q_OBJECT
public:
CUtility(QWidget *p_parent = 0) : QWidget(p_parent){qDebug() << "CUtility constructor";}
void utilityMethod() {qDebug() << "This is CUtility::utilityMethod()";}
};
}
CMyClass::CMyClass()
{
qDebug() << "CMyClass constructor.";
}
void CMyClass::someMethod()
{
qDebug() << "This is CMyClass::someMethod().";
CUtility p_myUtil;
p_myUtil.utilityMethod();
}
Run Code Online (Sandbox Code Playgroud)
错误是:
LNK2001:未解析的外部符号“ public:虚拟结构QMetaObject const * __cdecl`匿名命名空间':: CUtility :: metaObject(void)const“(?metaObject @ …