Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何初始化c++;班级成员_C++_Qt_Reference - Fatal编程技术网

C++ 如何初始化c++;班级成员

C++ 如何初始化c++;班级成员,c++,qt,reference,C++,Qt,Reference,及 作为错误源。我曾尝试将testControl用作指针和引用,但我遇到了许多其他错误……有人能帮我解决这个问题并向我解释发生了什么吗?您在标题中的test类定义中提供了test构造函数的隐式内联定义: test(QWidget *parent = 0) : control(device,0) {} 这很可能是编译器所抱怨的。除此之外,您还可以在.cpp文件中提供不同的定义。您只能有一个定义 有两种方法可以解决这个问题 1) 类定义中构造函数的隐式内联定义。修改现有标题代码,以调用初始化列表中


作为错误源。我曾尝试将testControl用作指针和引用,但我遇到了许多其他错误……有人能帮我解决这个问题并向我解释发生了什么吗?

您在标题中的
test
类定义中提供了
test
构造函数的隐式内联定义:

test(QWidget *parent = 0) : control(device,0) {}
这很可能是编译器所抱怨的。除此之外,您还可以在
.cpp
文件中提供不同的定义。您只能有一个定义

有两种方法可以解决这个问题

1) 类定义中构造函数的隐式内联定义。修改现有标题代码,以调用初始化列表中相应的
QMainWindow
构造函数。并从
.cpp
文件中删除构造函数定义:

// in test.h
test(QWidget* parent = 0) : QMainWindow(parent), control(device, 0) 
{
  ui.setupUi(this);    
  device.start();  
  control.start();
}
2) 在标题中声明构造函数,并在
.cpp
中定义它:

// in test.h
test(QWidget* parent = 0); // declaration, no definition

// in test.cpp
test::test(QWidget* parent = 0) : QMainWindow(parent), control(device, 0) 
{
  ui.setupUi(this);    
  device.start();  
  control.start();
}
这两种解决方案中的任何一种都应该有效。您不能将这两者结合起来,这就是您的代码示例所展示的


您可能还需要定义
test::~test()
。在代码示例中,您只显示一个声明。

构造类时,也会构造所有数据成员。如果特定数据成员有默认构造函数,则执行该构造函数

如果需要执行特定的非默认构造函数,则必须使用成员初始化列表来构造该特定数据成员

我怀疑你的问题在于你的

testDevice device;
testControl control;
数据成员,或两者兼而有之


这两个类的可用构造函数是什么?如果没有可用的默认构造函数,则必须在成员的初始化列表中初始化它们,并提供适当的参数参数。

您有两个主要问题:

1) 您可能应该编写此构造函数,将构造函数的定义留在头中

您遇到了提供的两个定义的陷阱,一个在头文件中,另一个在源文件中

您需要在头中有声明,在源中有定义,或者在头中有声明和定义。头文件和源文件中不能分布一个声明和两个定义

头文件中的空定义是
{}
,而源文件中的另一个定义是
{..}
。编译器如何知道您真正想要的是哪一个?它不能可靠地。。。即使它选择了任何一个版本

2) 此外,testControl析构函数似乎是私有的。这不是一个好主意。将该析构函数更改为公共

测试h testControl.h
#pragma一次
#包括
#包括“testDevice.h”
类testControl:公共QThread
{
Q_对象
公众:
testControl(testDevice&device,QObject*parent=0);
//将其更改为“公共”而不是代码中的“私有”。
~testControl(void);
受保护的:
无效运行(void);
私人:
测试设备;
};

您的班级名为“test”,您如何到达SARA?莎拉的密码在哪里对不起,哈哈,我的错,我把所有的东西都重新命名了,这个逃走了:P我会编辑的,你能告诉我确切的错误吗?我不认为我完全理解你说的话,但它仍然没有work@mFeinstein:然后,您必须向我们展示如何实例化
测试
对象。您是否确保删除了
.h
中的
{}
并添加了一个
?你是什么意思?都在里面…test是一个默认的Qt自动生成类,但我没有在这两个类中都有…只是在.h中,那么我怎么可能引用它两次呢?@mFeinstein我试图澄清我的答案。简而言之,您当前不仅在头中声明构造函数,还定义它,即给它一个实现。所以您有两个实现。在不清楚的情况下,函数的定义是C++实现,“TestDebug设备”工作正常,它有一个默认的控制器……我只是向代码添加了“TestCuffic控件”,这个类没有默认的构造函数,因此,我为它添加了一个初始化列表,正如我在代码中所显示的那样。但它不起作用。什么让我感到困扰…有什么想法吗?什么是构造函数,你传递了什么参数,你得到了什么错误?这起作用了!但是我不得不在testControl.h中公开这个“设备”。。。为什么?@mFeinstein:我延长了我的回答。这是因为它不是设备,但是你的析构函数也在私有部分下@爱因斯坦:是的。这就是我们在这里的原因,对吗?;-)还有什么需要回答的吗?或者你现在对此没意见了?我只是不明白双重定义有什么错…好吧,在.cpp中实现的所有方法都必须在.h中公开…所以两者都应该有一个声明…不是吗?@mFeinstein:你需要在头中有声明,在源中有定义,或标题中的声明和定义。不能有一个声明和两个定义!头文件中的空定义是{},而源文件中的另一个定义是{….}。编译器如何知道您真正想要的是哪一个?
// in test.h
test(QWidget* parent = 0); // declaration, no definition

// in test.cpp
test::test(QWidget* parent = 0) : QMainWindow(parent), control(device, 0) 
{
  ui.setupUi(this);    
  device.start();  
  control.start();
}
testDevice device;
testControl control;
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_test.h"
#include "testDevice.h"
#include "testControl.h"

class test : public QMainWindow
{
    Q_OBJECT

public:
    // Only declare, do not define it here
    // Also, for completeness: you should use the "explicit" keyword in here.
    explicit test(QWidget *parent = 0);
    ~test();

private:
    Ui::testClass ui;
    testDevice device;
    testControl control;
};
#include "test.h"

test::test(QWidget *parent = 0)
    : QMainWindow(parent)
    , control(device,0)
{
    ui.setupUi(this);    
    device.start();  
    control.start();
}

test::~test()
{
}
#pragma once

#include <QThread>
#include "testDevice.h"

class testControl : public QThread 
{
    Q_OBJECT

public:
    testControl(testDevice& device, QObject *parent = 0);
    // Change this to being _public_ rather than _private_ as in your code.
    ~testControl(void);

protected:
    void run(void);

private:
    testDevice device;
};