为什么std:cout不打印3
为了使用预定义的m_size构造派生对象,开发了以下代码。但是这个想法似乎没有得到正确的实现,因为std:cout只打印了Data1Size以外的任何东西。有人能纠正我吗?
untitled.pro
TARGET = untitled
TEMPLATE = app
QMAKE_CXXFLAGS += -std=c++0x
SOURCES += main.cpp \
genericdata.cpp
HEADERS += \
genericdata.hmain.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_Hgenericdata.cpp
#include "genericdata.h"
GenericData::GenericData(int size) :
m_size(size)
{
std::cout << "m_size: " << m_size << std::endl;
}发布于 2016-03-03 01:20:58
非静态成员Data1Size的类内初始化器
const int Data1Size = 3;简单地说,编译器将在Data1Size的构造函数中为GenericData生成一个隐式构造函数初始化程序列表条目。因此,实际上,GenericData的构造函数如下所示
GenericData::GenericData(int size) :
m_size(size), Data1Size(3)
{
std::cout << "m_size: " << m_size << std::endl;
}它是GenericData的构造函数,它将Data1Size设置为其初始值3。
但是,在基类Data1Size的构造函数有机会做任何事情之前,您正在访问派生类中的GenericData。此时,Data1Size仍未初始化。
发布于 2016-03-03 01:16:02
在这里设置Data1Size之前,您正在使用它:
Data1() : GenericData(Data1Size) {}这将在构造Data1Size之前访问GenericData。毕竟,您正在准备参数来调用构造函数,所以它不可能已经被构造了。但是Data1Size是GenericData的一个成员--您必须已经拥有该类的一个实例才能访问它。
https://stackoverflow.com/questions/35761232
复制相似问题