【问题标题】:Constructor cannot be redeclared. Why?构造函数不能被重新声明。为什么?
【发布时间】:2019-12-29 14:57:47
【问题描述】:

我在我的 Qt C++ 程序中遇到了这个问题,它显示“无法重新声明构造函数”。我该如何解决?

class MagicTransaction : public QObject
{
  Q_OBJECT
public:
  explicit MagicTransaction ( QObject* parent = 0 );
private slots:
  void start ( );
  MagicTransaction( QObject* parent );
};

【问题讨论】:

  • 不清楚您到底想要发生什么?为什么要声明两个接受完全相同参数的构造函数?

标签: c++ qt constructor compiler-errors


【解决方案1】:

您有两个 MagicTransaction 构造函数声明,它们接受 QObject* 参数 - 一个在 public 部分,一个在 private 部分(请注意,默认值和 explicit 修饰符不要t 参与名称修改)。只需删除一个就可以了:

class MagicTransaction : public QObject
{
  Q_OBJECT
public:
  explicit MagicTransaction ( QObject* parent = 0 );
private slots:
  void start ( );
  // second definition removed here
};

【讨论】:

    【解决方案2】:

    很简单——你已经在不同的部分声明了相同的构造函数两次:

    class MagicTransaction : public QObject
    {
      Q_OBJECT
    public:
      explicit MagicTransaction ( QObject* parent = 0 );
    private slots:
      void start ( );
      MagicTransaction( QObject* parent ); // <---- remove this
    };
    

    删除第二个声明

    【讨论】:

      【解决方案3】:

      从未见过在 Qt 中将构造函数用作插槽,这看起来很奇怪。

      只有在对象完全构造后才调用槽,而且我很确定 C++ 不允许多次构造同一个对象。

      如果您想要一个以某种方式接受父指针的插槽(我不确定您是否尝试更改 Qt 层次结构中对象的所有权,这似乎也不寻常,但我认为 有可能),你需要给它起别的名字,比如:

      void ChangeMyOwner(QObject *parent);
      

      【讨论】:

        【解决方案4】:

        你有构造函数

        explicit MagicTransaction ( QObject* parent = 0 );
        

        然后你有一个函数是

        MagicTransaction( QObject* parent );
        

        插槽是函数,因此您有两个相同的函数,其中一个是构造函数,另一个不是。重命名第二个,你会很高兴的。

        【讨论】:

        • 正如错误消息所说,它们都是同一个构造函数的声明。
        • 或者这是 Qt 特有的? (对不起,我没有注意到,删除了我的反对票)
        • @walnut 不,你是对的,插槽基本上只是在“插槽”部分中像普通函数一样声明 - 但你不能在那里放置构造函数 AFAIK,它当然不能重复构造函数的(正常)
        • @rbaleksandar 你的回答对我来说很好,我认为核桃删除了他的-1,所以不确定另一个来自哪里,无论如何,+1 来解决不公正
        • @code_fodder XD 我不是关于 - 或 +。只是我特别对那条评论感到困惑。
        猜你喜欢
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2018-06-06
        • 2021-06-11
        • 2019-11-05
        • 2018-07-03
        • 1970-01-01
        • 2013-08-27
        相关资源
        最近更新 更多