繁体   English   中英

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

[英]Initializing private static member in .cpp gives me error: undefined reference

初始化私有静态成员的回答说,私有静态成员应该在源文件中初始化。

因此,这就是我尝试的方法:

。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”是私有静态pthread_mutex_t MutexVariable; // = PTHREAD_MUTEX_INITIALIZER; ^

您应该在构造函数之外将其初始化为单独的数据变量:

pthread_mutex_t MainWindow::mutexVariable     = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t MainWindow::conditionVariable = PTHREAD_COND_INITIALIZER;

编辑:

您可以参考SO中的此帖子以获取静态成员初始化的说明。

根据第9.4.2 N3797条 (又称[class‌.static.data])

静态数据成员在其类定义中的声明不是定义,并且可以是cv限定的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

赋值和初始化是两个完全不同的事物,尽管它们看上去常常令人困惑。 您有分配,而不是初始化。

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

pthread_mutex_t MainWindow::mutexVariable     = PTHREAD_MUTEX_INITIALIZER;

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

MainWindow::mutexVariable     = PTHREAD_MUTEX_INITIALIZER;

这是一项任务。 它仅在函数内部合法。 您可以根据需要选择任意数量的对象,并且每个对象可以执行任意次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM