我有一个非常有趣和有趣的C ++练习:
强制主要:
int main(void)
{
Exam e = Exam(&Exam::cheat);
e.kobayashiMaru = &Exam::start;
(e.*e.kobayashiMaru)(3);
Exam::cheat = true;
if (e.isCheating())
(e.*e.kobayashiMaru)(4);
return (0);
}
这是问题输出:
[The exam is starting]
3 Klingon vessels appeared out of nowhere.
You lost again.
[The exam is starting]
4 Klingon vessels appeared out of nowhere.
Win !
您现在需要创建Exam
类以获得正确的输出。
这就是我所做的:
class Exam
{
public:
Exam(bool *_cheat);
typedef void (Exam::*func)(int);
void start(int);
bool isCheating();
static bool cheat;
func kobayashiMaru;
};
我遇到Exam(&Exam::cheat)
事的问题。到目前为止,我所理解的是Exam
正在使用它自己的cheat
变量的地址。输入Exam
的构造函数cheat
时未初始化。所以对我来说,我会用false
初始化它。
Exam::Exam(bool * _cheat)
{
*_cheat = false;
}
但通过这样做,我获得了Exam(&Exam::cheat)
的多重定义。我不确定我的反思,也许有人可以告诉我这里发生了什么?
答案 0 :(得分:0)
变化:
static bool cheat;
为:
bool cheat;
在Exam
类中,允许每个新对象使用自己的值处理自己的cheat
变量。
构造函数将使用给定值初始化您的cheat
变量,同时使用如下构造函数创建新对象:
Exam::Exam(bool isCheating)
{
this->cheat = isCheating;
}
或者,如果您希望将cheat
变量初始化为false / true,则默认情况下可以使用以下构造函数:
Exam::Exam()
{
cheat = false;
//or cheat = true;
}
您也可以处理多个构造函数。
现在从Exam
类创建新对象:
Exam *exam1 = new Exam(true); //Will initialize cheat as false
Exam *exam2 = new Exam(false); //Will initialize cheat variable as true
然后访问exam1和exam2对象中的方法,如下所示:
exam1->methodName(1243);
exam2->secondMethodName(true);
exam2->thirdMethodName();
exam3->addFriend(&exam1);
那些只是例子。
希望我理解你的问题。 :)
答案 1 :(得分:0)
您有一些问题(在下面的评论中描述)
class Exam
{
public:
// If cheat is supposed to be a member variable assigned to each instance, passing a pointer to itself is silly and unnecessary
// If cheat is supposed to be shared between all instances of exam, passing a pointer to itself is silly and unnecessary
Exam(bool *_cheat);
static bool cheat;
// these two declarations are unnecessary. They do nothing but add complexity where it is not needed
typedef void (Exam::*func)(int);
func kobayashiMaru;
void start(int);
bool isCheating();
};
我遇到了考试(& Exam :: cheat)的问题。我是什么 到目前为止,我们理解的是,考试正在考虑它自己作弊的地址 变量。进入考试的构造函数时,作弊未初始化。 所以对我来说,我会在这里用false初始化它。
在创建类的第一个实例之前初始化静态变量。您遇到的问题有两个:1)您尚未初始化静态成员变量,2)您并未将其视为静态成员变量。
将变量声明为static
意味着它将在类的所有实例之间共享(例如,cheat
将有1个内存位置)。除非你希望每个人在{1}}作弊时尽快作弊,否则这不太可能是你想要的。
要修复它,您希望Exam
类看起来更像这样:
Exam
class Exam
{
public:
Exam(bool cheat) : m_cheat(cheat) {}
// don't expose member variables directly - use accessor functions
void setCheating(bool cheat) { m_cheat = cheat; }
bool isCheating() const { return m_cheat; }
void start(int);
private:
bool m_cheat;
};
功能的相应更改
main