OOP:没有静态成员或完全重新设计的类

时间:2016-04-24 22:20:20

标签: c++ oop

我正在教授c ++课程,在其中一个项目中,学生需要编写Robot类的代码。

修复了Robot构造函数,并根据学生无法修改的函数创建实例。然而,课堂设计的其余部分留作练习。

我想确保Robot实例不能轻易地在彼此之间共享信息。如果学生想要共享信息,他可以创建类的静态成员,或者在类的实现中使用静态变量来存储有关每个实例的信息。 可能还有其他方法可以利用这种语言来欺骗"欺骗" (例如,使用套接字写入文件...)。

有没有办法检查这种滥用行为(例如是否存在静态成员)?我现在对任何建议持开放态度。 我应该考虑进行彻底的重新设计,以便每个实例都生活在一个完全不同的世界中。这会阻止他们彼此沟通? 这是一个根本不可能防止的问题吗?我应该警告他们这种行为的严重影响吗?

感谢。

修改 我问这个问题的原因不是为了减轻评分。我计划创建一个自动化平台,让学生可以提交他们的代码并让他们互相竞争。在这种情况下,我无法在发布代码之前阅读并验证代码。 我想阻止" easy"滥用(例如静态成员)并认为更多涉及滥用的行为并不常见。

因此我的问题确实是:有没有办法以编程方式阻止学生拥有静态成员(模板黑客或其他东西),或者我应该重新设计课程。感谢

2 个答案:

答案 0 :(得分:0)

  

有没有办法检查这种滥用行为(例如是否存在静态成员)?

是:阅读代码。

可能有某种方法可以通过语言黑客和/或在生成的代码上运行解析器来自动禁止此操作。但一般情况下,如果这些解决方案完全正常工作,那么这些解决方案将方式过度杀伤。

所以,只需做我们在行业中所做的事情:用你的眼睛审查代码,并做出相应的标记!希望你在决定给学生的标记之前已经阅读过代码了,所以这应该不是你的牙齿。

请记住提前告诉你的学生你不想看到这样的hackery。

答案 1 :(得分:0)

  

有没有办法检查这种滥用行为(例如是否存在静态成员)?

有点儿。在C ++中以编程方式,没有--C ++没有反射,因此没有办法编写类型特征has_static_member<T>

您基本上需要的是您自己的C ++解析器来生成AST,然后您可以走路以确定是否存在static成员。我不建议尝试编写自己的C ++ AST解析器。谢天谢地,您可以使用clang's。哪个也可以使用in Python。而现在只需要弄清楚如何使用它来给你想要的答案。

举个例子,

class Robot {
public:
    Robot();
    void foo();
private:
    static int bar;
    double quux;
};

通过ast-dump命令运行时,我发现:

|-CXXRecordDecl 0x491c9d8 <main.cpp:1:5, line:8:5> line:1:11 class Robot definition
| |-CXXRecordDecl 0x491caf0 <col:5, col:11> col:11 implicit referenced class Robot
| |-AccessSpecDecl 0x491cb80 <line:2:5, col:11> col:5 public
| |-CXXConstructorDecl 0x491cc50 <line:3:9, col:15> col:9 Robot 'void (void)'
| |-CXXMethodDecl 0x496f900 <line:4:9, col:18> col:14 foo 'void (void)'
| |-AccessSpecDecl 0x496f9a8 <line:5:5, col:12> col:5 private
| |-VarDecl 0x496f9e0 <line:6:9, col:20> col:20 bar 'int' static
| `-FieldDecl 0x496fa50 <line:7:9, col:16> col:16 quux 'double'

所以你正在寻找属于类成员的VarDecl(因为非静态成员是FieldDecl)。