【问题标题】:Hiding the Contents of a Header File隐藏头文件的内容
【发布时间】:2020-01-18 12:02:09
【问题描述】:

我是一名导师,我正在尝试写一些东西来帮助学生学习 C++。假设我有一个包含两个 .h 文件的 .cpp 文件,我们将它们称为“solution.h”和“student_answer.h”。 “solution.h”文件包含一个名为“Solution”的类,它实现了解决问题的成员函数和变量。学生们将在一个单独的“student_answer.h”文件中实现他们自己对同一问题的解决方案,在一个我们称之为“学生”的课程中。

.cpp 文件然后应采用两个类定义,“Solution”(在 solution.h 中定义的类)和“Student”(在 student_answer.h 中定义的类),并运行这两个实现以验证是否学生的答案是正确的,如果学生的答案有错误,它应该提供详细的输出。但是,我希望能够对学生隐藏 solution.h 文件(或“解决方案”类)的内容,同时仍然为他们提供可以编译和运行自己的解决方案的 .cpp 文件。

目前,我有这样的事情:

#include "solution.h"
#include "student_answer.h"

// ...

int main() {
   Solution s;
   Student a;
   // run member functions of s and a, compare results to verify if student
   // implementation is correct (and print helpful output if there is a bug)
   ...
}

有没有办法在不向学生透露 solution.h 文件的情况下做同样的事情?有没有更好的方法来做到这一点?

谢谢!

【问题讨论】:

  • C 没有类类型。 C标签在这里不适用。
  • 投票结束作为 POB。也就是说,一个简单的方法是不在solution.h 中实现任何东西。将类声明放在solution.h 中,然后在solution.cpp 中实际定义solution.h 的实现。这让你和学生都有相同的声明,然后你只需在编译时指向你的solution.cpp,或者学生的solution.cpp
  • 当然,解决方案应该只保存定义,而实现应该以库的形式编译(假设您希望它们能够自己运行)。这样他们就看不到代码了。
  • 也许你应该发现单元测试。

标签: c++ header include header-files


【解决方案1】:

创建一个Solution.h 的静态或动态库,对其进行编译,并将其与项目链接。学生们现在得到了带有声明的解决方案的标题,但没有定义。 图书馆主题有点太复杂,无法在一个答案中解释。观看 TheChernoProject (https://www.youtube.com/watch?v=Wt4dxDNmDA8) 的视频。 另一种方法是,使代码不可读(定义)或将其放入 asm 块中。

【讨论】:

    【解决方案2】:

    有没有办法在不向学生透露 solution.h 文件的情况下做同样的事情?

    没有。

    最好不要将任何实现细节放入 solution.h 中,而是提供一个预编译的库进行比较。这将阻止学生看到除了 API 之外的解决方案,这大概是学生说明的一部分。

    这确实有一个挑战,即预编译的库必须与学生使用的系统兼容。这可以通过指导学生使用提供的 VM 或容器映像来解决。 但是,这种方法不会阻止学生通过委托解决方案 API 来实现他们的 API。

    确实没有必要提供正确的解决方案。只为自己写解决方案;编写通过您的解决方案或学生的解决方案所需的测试;使用您的解决方案测试测试;仅向学生提供测试,而不是您的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      相关资源
      最近更新 更多