2016-03-03 75 views
0

爲什麼不std:cout打印3C++繼承誤解

隨着構建派生對象,具有預定義的m_size下面的代碼被開發的意圖。但似乎這個想法沒有正確實施,因爲std:cout只能打印Data1Size。有人能糾正我嗎?

untitled.pro  

TARGET = untitled 
TEMPLATE = app 

QMAKE_CXXFLAGS += -std=c++0x 

SOURCES += main.cpp \ 
    genericdata.cpp 

HEADERS += \ 
    genericdata.h 

的main.cpp

#include "genericdata.h" 

int main(int argc, char *argv[]) 
{ 
    Data1 data; 

    return 0; 
} 

genericdata.h

#ifndef GENERICDATA_H 
#define GENERICDATA_H 

#include <iostream> 

class GenericData 
{ 
    int m_size; 

protected: 
    const int Data1Size = 3; 

public: 
    explicit GenericData(int size); 
}; 

class Data1 : public GenericData { 
public: 
    Data1() : GenericData(Data1Size) {} 
}; 

#endif // GENERICDATA_H 

genericdata.cpp

#include "genericdata.h" 

GenericData::GenericData(int size) : 
    m_size(size) 
{ 
    std::cout << "m_size: " << m_size << std::endl; 
} 
+0

究竟輸出了什麼?你期望輸出什麼? –

+0

得到了'm_size:57',並期待'm_size:3'。說得通? – KcFnMi

+0

當你單獨使用調試器時發生了什麼? –

回答

2

在一流的初始化非靜態成員Data1Size

const int Data1Size = 3; 

只是意味着,編譯器將生成Data1SizeGenericData構造的隱式構造函數初始化列表條目。所以,在現實的GenericData的構造函數如下所示

GenericData::GenericData(int size) : 
    m_size(size), Data1Size(3) 
{ 
    std::cout << "m_size: " << m_size << std::endl; 
} 

這是GenericData構造,設置Data1Size3其初始值。

但是,您在派生訪問Data1Size前基類GenericData的構造還來不及做任何事情。此時Data1Size仍未初始化。

+0

我想我現在明白這個問題。相反,使'const static int Data1Size = 3;'是正確的方法嗎? – KcFnMi

+1

@KcFnMi:​​是的,如果你希望這個值對於這些類的所有實例始終是'3',那麼正確的做法是'static const int Data1Size = 3;'。 – AnT

1

您正在使用Data1Size設置之前在這裏:

Data1() : GenericData(Data1Size) {} 

訪問Data1SizeGenericData構建之前。畢竟,你正在準備調用構造函數的參數,所以它還不能被構建。但Data1SizeGenericData的成員 - 您必須已擁有該類的實例才能訪問它。