簡體   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