我想知道如何为每个派生类制作不可修改的父类成员。
我的代码现在正确地赋予它的值(取决于调用父类'构造函数的Child类),但m_type
可以很容易地修改(例如在myfunction
中)和那个& #39; s我想避免的事情。
#include <iostream>
enum Piece_type{ king=1, queen=3, rook=3, bishop=4, knight=5, pawn=6};
class Piece
{
protected:
Piece_type m_type; // static Piece_type m_type; <- doesn't work
Piece(Piece_type ex): m_type(ex) {}
};
class Pawn: public Piece
{
public:
Pawn():Piece(pawn) {} // To initialise m_type as pawn for all my Pawn objects
void myfunction()
{
std::cout<<"My piece type is "<< m_type<<std::endl;;
m_type= knight; // This is the assignation I want to avoid happening
std::cout<<"My new piece type i "<<m_type<<std::endl;
}
};
我的问题与this one有关,但继承似乎无法声明静态变量并通过成员初始化程序定义其值。
我已经找到了如何从this question中的Child类调用父/基类构造函数。
提前致谢,
爱德华
修改
我稍微对其进行了修改,以免混淆任何人,因为const
确实可以解决我说过的问题。
答案 0 :(得分:3)
嗯,你没有陷入通常的错误,即在没有成员初始化列表的情况下尝试使用CREATE MEMBER CURRENTCUBE.[Timeframe].[Timeframe].[ROLLING 3 MONTH]
AS IIF([Accounting Date].[Accounting Date].CurrentMember.Level.Name="Month", AGGREGATE(LASTPERIODS(3),[Timeframe].[Timeframe].&[1]), NULL),
VISIBLE = 1;
成员变量,所以const
就是你真正需要的:
const
答案 1 :(得分:3)
他们只有阻止派生类型修改父级成员的方法是使这些成员成为private
或const
。由于您无法成为成员const
,因此唯一的另一种方式是声明成员private
并添加protected
访问者方法,例如:
Piece_type get_type() const
{
return m_type;
}
这样,派生类可以调用get_type()
来了解m_type
的值,但不能直接访问它,阻止它们写入它。