Initializing private static members中的答案说私有静态成员应该在源文件中初始化。
因此,这就是我的尝试:
·H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QApplication>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <iostream>
#include <QDebug>
class MainWindow : public QMainWindow
{
Q_OBJECT
static pthread_mutex_t mutexVariable;
static pthread_cond_t conditionVariable;
static QList <int> queueLIFO;
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
static void *producerThreadFunction (void *arg);
static void *consumerThreadFunction (void *arg);
int start ();
};
#endif // MAINWINDOW_H
和.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
MainWindow::mutexVariable = PTHREAD_MUTEX_INITIALIZER;
MainWindow::conditionVariable = PTHREAD_COND_INITIALIZER;
}
错误:对“MainWindow :: mutexVariable”的未定义引用
错误:未定义对'MainWindow :: conditionVariable'的引用
我也试过这个:
#include "mainwindow.h"
MainWindow::mutexVariable = PTHREAD_MUTEX_INITIALIZER;
MainWindow::conditionVariable = PTHREAD_COND_INITIALIZER;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
}
结果是:
错误:'pthread_mutex_t MainWindow :: mutexVariable'是私有的 static pthread_mutex_t mutexVariable; // = PTHREAD_MUTEX_INITIALIZER; ^
答案 0 :(得分:2)
您应该在构造函数外部将其初始化为单独的数据变量:
pthread_mutex_t MainWindow::mutexVariable = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t MainWindow::conditionVariable = PTHREAD_COND_INITIALIZER;
修改强>
您可以参考SO中的this post以获取有关静态成员初始化的说明。
答案 1 :(得分:2)
根据第9.4.2条N3797 a.k.a. [class .static.data]
静态数据成员在其类定义中的声明不是定义,除了cv-qualified void之外可能是不完整的类型。静态数据成员的定义应出现在包含成员类定义的命名空间范围内。在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定。静态数据成员定义中的初始化表达式在其类
的范围内
您需要将这些代码放在构造函数之外
pthread_mutex_t MainWindow::mutexVariable = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t MainWindow::conditionVariable = PTHREAD_COND_INITIALIZER;
<强>更新强>
当天结束时,您可以稍后在构造函数中更改该值,当然我不知道您为什么需要更改它:
#include "mainwindow.h"
pthread_mutex_t MainWindow::mutexVariable = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t MainWindow::conditionVariable = PTHREAD_COND_INITIALIZER;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
MainWindow::mutexVariable = /* another mutex */;
MainWindow::conditionVariable = /* another mutex */;
}
顺便说一下,我建议你不要使用原始互斥和条件变量。如果您有权访问C ++ 11或更高版本,我建议您使用std::mutex
和std::condition_variable
。或者您可以在Qt中使用QMutex
,QWaitCondition
和QReadWriteLock
答案 2 :(得分:1)
分配和初始化是两个完全不同的东西,尽管它们通常看起来容易混淆。你有作业,而不是初始化。
但是错误消息没有说“未初始化”,他们说“未定义”。这意味着您的程序缺少 definitios 。
pthread_mutex_t MainWindow::mutexVariable = PTHREAD_MUTEX_INITIALIZER;
这是一个定义。你知道这是因为它以一种类型开头。对于整个程序中的每个静态数据成员,在任何函数之外,您必须只有一个。初始化与定义相关联,并且只执行一次(如果使用变量)。
MainWindow::mutexVariable = PTHREAD_MUTEX_INITIALIZER;
这是一项任务。它只在函数内合法。你可以拥有任意数量的那些,每一个都可以执行任意次。