小编pab*_*ker的帖子

创建虚拟函数的纯虚函数是危险的吗?

让我们假设我们有一个抽象类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)

c++ abstract-class pure-virtual

11
推荐指数
1
解决办法
638
查看次数

如何按值返回“QObject”派生类?

为了提高代码可读性,我想在函数内创建一个对象并按值返回它(我让编译器承担优化内存的任务)。

如果我有常规课程,我可以执行以下操作:

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)

c++ qt

5
推荐指数
1
解决办法
2213
查看次数

在匿名名称空间中定义QObject派生类?

我正在使用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 @ …

c++ qt

4
推荐指数
1
解决办法
833
查看次数

标签 统计

c++ ×3

qt ×2

abstract-class ×1

pure-virtual ×1