将在警告修复后初始化

Posted

技术标签:

【中文标题】将在警告修复后初始化【英文标题】:Will be initialized after warning fix 【发布时间】:2017-11-23 22:43:25 【问题描述】:

晚上好(感恩节快乐),

我有以下代码(从我的主代码中提取到一个独立文件中)并且收到了一些我想解决的警告消息。

代码如下:

#include <cassert>
#include <ostream>
#include <climits>
#include <iostream>
#include <string>

using namespace std;

class WordCount

public:
   // Constructors
   WordCount() : word(""), count(0)  
   WordCount(string theWord, unsigned theCount = 1) : word(theWord), count(theCount)  

   // Accessors
   string Word() const  return word; 
   unsigned Count() const  return count; 

   // Mutator
   void Update()  ++count; 

   // Output a Word to a stream.
   void Show(ostream &os)   os << word << "=" << count; 

   // Overloaded relational operators
    bool operator<(WordCount &rhs)  return word < rhs.word; 
    bool operator>(WordCount &rhs)  return word > rhs.word; 
    bool operator==(WordCount &rhs)  return word == rhs.word; 
    bool operator<=(WordCount &rhs)  return word <= rhs.word; 
    bool operator>=(WordCount &rhs)  return word >= rhs.word; 
    bool operator!=(WordCount &rhs)  return word != rhs.word; 

private:
   string   word;    // The word to be counted
   unsigned count;   // The number of occurrences
;

class Queue 

private:
    struct Node
    
        WordCount data; //data in node
        Node *next;     //pointer to next node

        // Default Constructor
        Node() : next(0) 
        // Explicit Constructor
        Node(const WordCount &theData, Node *const theNext = 0)
            : data(theData), next(theNext)  
    ;
public: 
    Queue() : head(0), tail(0)                
    bool Empty() const  return head == 0;     
    void Enqueue(const WordCount &elem);            
    WordCount Dequeue();                            
    WordCount Head()  return head->data; 
private:
    Node *tail;     // "end" of queue
    Node *head;
;

void Queue::Enqueue(const WordCount &elem)

    Node* temp = new(nothrow) Node(elem);
    assert(temp != NULL);

    // head == tail if head == NULL, so must also be assigned temp
    if (head == NULL)
        head = temp;
    // add temp after current tail
    else
        tail->next = temp;
    // update tail adress to be new temp node
    tail = temp;


WordCount Queue::Dequeue()

    assert (!Empty());
    WordCount poppedData = head->data;
    Node *temp = head;
    head = head->next;
    if (head == NULL) 
        tail = NULL;
    delete temp;   
    return poppedData;


int main()

    return 0;

当我执行 g++ test.cpp -Wall 时,我收到以下警告

test.cpp: In constructor 'Queue::Queue()':
test.cpp:61:8: warning: 'Queue::head' will be initialized after [-Wreorder]
  Node *head;
        ^
test.cpp:60:8: warning:   'Queue::Node* Queue::tail' [-Wreorder]
  Node *tail;  // "end" of queue
        ^
test.cpp:54:2: warning:   when initialized here [-Wreorder]
  Queue() : head(0), tail(0) 

有没有办法让我重写/重新排列代码以保持其功能并删除这些警告?我完全不熟悉这个警告,并且一直在阅读它,但是很多代码示例对我来说很难理解,更不用说理解解决它的方法了。

任何建议将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

成员按声明顺序初始化。让你的成员初始化列表以其他顺序排列可能会让程序员感到困惑,他们可能不知道遵循哪个顺序,或者可能不知道成员是以不同的顺序声明的,因此可能期望成员初始化的顺序为是成员初始化列表的顺序 - 这不是你的情况。警告的目的是强调这一事实。在一个成员的初始化依赖于另一个成员的情况下,这一事实可能非常重要。

我有没有办法重写/重新排列代码以保持其功能并删除这些警告?

是的。通过更改成员声明的顺序以匹配成员初始化列表的顺序,即

Node *head;
Node *tail;     // "end" of queue

或者,您可以更改成员初始化列表的顺序以匹配成员声明的顺序。

【讨论】:

哇,简直不敢相信这么简单。我认为这是完全不同的事情,并试图转发声明我的结构,将节点移动到第一个私人调用中,等等。谢谢。【参考方案2】:

变量是按照它们的声明顺序进行初始化的,而不是按照它们在初始化列表中出现的顺序。你的编译器只是警告你这个事实。您只需更改顺序,警告就会消失。

【讨论】:

【参考方案3】:

成员按照它们在类中声明的顺序进行初始化。无论您在初始化列表中使用的顺序如何。以正确的顺序初始化成员,警告就会消失。

【讨论】:

以上是关于将在警告修复后初始化的主要内容,如果未能解决你的问题,请参考以下文章

如何修复警告:扩展初始化列表?

如何修复警告:函数范围的静态 __shared__ 变量不支持动态初始化?

gcc编译选项-Wall(编译警告:未使用变量变量未初始化类型转换等)

如何修复 Xcode 7.3 警告:`init` 已弃用:它将在 Swift 3 中删除:在序列上使用`enumerate()` 方法 [重复]

启动Sony Vegas Pro9出现TWAIN_32.dll丢失警告怎办

在Cocos2dx中初始化粒子效果后的警告-“ libpng警告:iCCP:已知错误的sRGB配置文件”