在.cpp中初始化私有静态成员会给出错误:未定义的引用

时间:2015-12-14 07:39:24

标签: c++ static

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;                             ^

3 个答案:

答案 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::mutexstd::condition_variable。或者您可以在Qt中使用QMutexQWaitConditionQReadWriteLock

答案 2 :(得分:1)

分配和初始化是两个完全不同的东西,尽管它们通常看起来容易混淆。你有作业,而不是初始化。

但是错误消息没有说“未初始化”,他们说“未定义”。这意味着您的程序缺少 definitios

pthread_mutex_t MainWindow::mutexVariable     = PTHREAD_MUTEX_INITIALIZER;

这是一个定义。你知道这是因为它以一种类型开头。对于整个程序中的每个静态数据成员,在任何函数之外,您必须只有一个。初始化与定义相关联,并且只执行一次(如果使用变量)。

MainWindow::mutexVariable     = PTHREAD_MUTEX_INITIALIZER;

这是一项任务。它只在函数内合法。你可以拥有任意数量的那些,每一个都可以执行任意次。