Class 构造函数:不允许不完整的类型(在成员列表中)- VS C++ w/ QT

Class constructor: Incomplete type is not allowed (in member list) - VS C++ w/ QT

我在将这个新的 class/header 添加到这个预先存在的项目时遇到了问题。该项目在VS中,用C++编写,并与QT集成。我不断收到 "no appropriate default constructor available," 错误,并且智能感知在构造函数的成员列表中突出显示 m_Test(new Proj::Foo) 并说"incomplete type is not allowed."

假设项目名称是 Proj,class 名称是 Foo。

foo.h

#ifndef FOO_H
#define FOO_H

#include "custompanel.h"

class ParameterInterface;
class IsdbServiceInterface;

namespace Proj
{
    class Foo;
}

class Foo : public CustomPanel
{
    Q_OBJECT

public:
    explicit Foo(QWidget *parent = 0);
    ~Foo();

private:
    Proj::Foo* m_Test;
};
#endif

foo.c

#include "foo.h"

Foo::Foo(QWidget *parent) : CustomPanel(parent), m_Test(new Proj::Foo)
{
    m_Test->setupUi(this);
}

Foo::~Foo()
{
    delete m_Test;
}

我在项目中的其他工作示例之后对此进行了建模,我没有想到为什么我的会有所不同。有任何想法吗?我想知道我是否在这里遗漏了一些基本的东西。感谢您的观看。

您的 Foo class 定义不在 Proj 命名空间中,但您的 m_test 变量正在使用 Proj::Foo class。

实际上你有两个 classes:FooProj::Foo,其中 Proj::Foo 没有定义,只是一个前向声明。

要修复,请删除命名空间,或展开命名空间大括号以包含 Foo 定义。

就像第一个人说的那样,您可以通过删除 namespace 或像 class Proj::Foo : public CustomPanelFoo::Foo(QWidget *parent) : CustomPanel(parent), m_Test(new Proj::Foo)Proj::Foo::~Foo() 这样的扩展来解决不完整的类型问题。

不过,我要强调的是这个m_Test(new Proj::Foo)

new 正在调用 Proj::Foo 的默认构造函数,在默认构造函数 Foo(QWidget *parent = 0); 的定义中,这将导致递归调用构造函数并再次分配新的,这会引起问题。

一个快速的解决方法是将您现有的构造函数分成两个单独的构造函数,一个带参数 QWidget *parent 和一个不带参数的默认构造函数。

public:
    explicit Foo(QWidget *parent);
    Foo();
    ~Foo();

很抱歉没有完成这个问题。答案最终更多地涉及到QT...

基本上,我发现他们有第三个文件 -> ui_foo.h,由 qmake 生成。

ui_foo.h

QT_BEGIN_NAMESPACE

class Ui_Foo
{
public:
    void setupUi(QWidget *Foo)
    {
        // Setup stuff here
    }
};

namespace Proj {
    class Foo: public Ui_Foo {};
}

QT_END_NAMESPACE

这使得 Proj::Foo 继承自 Ui_Foo。我不确定这是否解决了其他人提出的 foo.h 中如何将 Proj::Foo 和 Foo 作为单独的 类 的问题,但它在不更改我最初发布的代码的情况下完美运行(不需要移动支架)。

看起来好像 Proj::Foo 和 Foo 是有意分开的 类。这避免了 Ediac 提出的问题,因为在 Foo 的构造函数中它调用了 Proj::Foo 的构造函数,从而避免了任何递归调用。整个项目中的几个不同的人多次模拟此代码。怎么看都觉得不靠谱...