为什么不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.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 :(得分:2)
非静态成员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
仍然没有初始化。
答案 1 :(得分:1)
在使用Data1Size之前,请先使用它:
Data1() : GenericData(Data1Size) {}
这会在Data1Size
构建之前访问GenericData
。毕竟,你正准备调用构造函数的参数,所以它还没有被构造。但Data1Size
是GenericData
的成员 - 您必须已有该类的实例才能访问它。