嗨,我创建了一个有三个构造函数的类,两个整数成员和一个一个const int成员。所以对于一个构造函数我使用初始化列表来分配const int成员但是我在其他两个构造函数中得到错误
这是我的代码:
class base
{
public:
base();
base(const int _count);
base(int a ,int b);
~base();
protected:
int m_ia , m_ib;
const int count;
};
base::base()
{
}
base::base(const int _count):count(_count)
{
}
base::base(int a , int b)
{
m_ia = a ;
m_ib = b;
}
base::~base()
{
}
void main()
{
base *obj2 = new base(1000);
getchar();
}
错误数量:2
1.'base :: count':必须在base()的构造函数base / member初始化列表中初始化
2.'base :: count':必须在base(int a,int b)的构造函数base / member初始化列表中初始化
答案 0 :(得分:4)
您应该确保所有构造函数都初始化所有成员变量,而不仅仅是作为参数传入的变量。我将构造函数重写为
base::base()
: m_ia() // value initializes i.e. sets to 0
, m_ib()
, count()
{
}
base::base(const int _count)
: m_ia()
, m_ib()
,count(_count)
{
}
base::base(int a , int b)
: m_ia(a)
, m_ib(b)
, count()
{
}
如果你有一个支持委托构造函数的C ++ 11编译器,你可以创建一个4构造函数,它接受3个参数并让其他构造函数委托给那个。
base::base()
: base(0, 0, 0)
{
}
base::base(const int _count)
: base(0, 0, _count)
{
}
base::base(int a , int b)
: base(a, b, 0)
{
}
base::base(int a , int b, int count)
: m_ia(a)
, m_ib(b)
, count(count)
{
}
如果您不希望它成为类接口的一部分,则可以使最后一个构造函数为private
。
答案 1 :(得分:3)
在c ++ 11中你可以拥有
protected:
int m_ia , m_ib;
const int count = 0;
适用于VS 2013.
答案 2 :(得分:0)
根据标准C ++和您当前的代码,您必须使用初始化列表在构造函数中初始化const变量,因此代码可以修改如下:
#include"iostream"
using namespace std;
class base
{
public:
base();
base(const int _count);
base(int a ,int b, const int _count);
~base();
protected:
int m_ia , m_ib;
const int count;
};
base::base():count(0)
{
}
base::base(const int _count):count(_count)
{
}
base::base(int a , int b, const int _count):count(0)
{
m_ia = a;
m_ib = b;
}
base::~base()
{
}
int main()
{
base *obj2 = new base(1000);
getchar();
return 0;
}