【问题标题】:Wrapping a C program that contains a main function into a C++ class,将包含 main 函数的 C 程序包装到 C++ 类中,
【发布时间】:2020-03-30 19:53:19
【问题描述】:

我最近被要求将包含 main 函数的 C 程序包装到 C++ 类中,但我没有看到有效执行此操作的一般方法。

比如我的C程序是

#include<stdio.h>
#include<stdlib.h>
int main(int argc, char * argv[]) {
        int i, sum = 0;

        if (argc != 3) {
                printf("Two numbers are needed.\n");
                exit(1);
        }
        printf("The sum is :%d \n ", atoi(argv[1])+atoi(argv[2]));


}

如何将这个主函数包装到 C++ 类中?我的模糊想法是使用C++构造函数来模拟main的argc和argv,但我不知道怎么做。你帮帮忙吗?

【问题讨论】:

  • 您的问题是如何更改代码以使其自然基于类?或者如何在技术层面上包装一个包含main 的不可更改的.c 文件?
  • C++ 和 C 程序的主函数是相同的,操作系统启动程序的方式没有区别。您可以做的是创建一个类并在主程序上实例化它并调用方法(C++),或者只是在您的主程序上调用函数并传递参数(C)。你的例子太简单了,没有比这更好的写法了。

标签: c++ c class wrapper main


【解决方案1】:

这并不难。只需将转换委托给main() 函数,并传递正确的值:

SumComputer computer(atoi(argv[1]), atoi(argv[2]));

printf("The sum is :%d \n ", computer.sum());

你有一个类,其中有一个像 SumComputer(const int a, const int b) 这样的构造函数和一个 int sum() const 函数。

您还可以拥有一个对象,它有一个简单的构造函数和一个更复杂的sum() 函数,甚至可能使用varargs

【讨论】:

    【解决方案2】:

    大概是这样的?

    class program {
    public:
      int main(int argc, char *argv[]) {
        int i, sum = 0;
    
        if (argc != 3) {
          printf("Two numbers are needed.\n");
          exit(1);
        }
        printf("The sum is :%d \n ", atoi(argv[1])+atoi(argv[2]));
        return 0; // WE MUST DO THIS NOW! 
      }
    };
    
    // actual main for testing
    int main(int argc, char **argv)
    {
       program p;
       return p.main(argc, argv);
    }
    

    我们可以让构造函数成为主函数,但这似乎是个坏主意;如果我们将任何内容放入program 类中,main 函数可能希望其构造在被调用之前完成。

    【讨论】:

    • 既然没有成员可以使用,为什么不让它成为一个静态函数呢?或者见鬼,为什么还要让它成为一门课呢?为什么不只拥有cmain(int argc, ...)?除非我们从 OP 获得更多信息,否则我不确定这是最好的方法。
    • 这在技术上是一种解决方案,但它违反了许多软件设计原则。 program 类应该有一个明确定义的任务,而不是像“接受输入、验证输入和转换一堆东西”这样的功能。这里有机会将它们分成不同的关注点,而且做到这一点并不难。
    • @tadman program 类中不应包含任何不在需求规范中的内容。实现大量不在需求中的东西违反了业务和软件工程原则。 The King's Toaster.
    • @kaz 我不是在谈论实现不同的功能,而是坚持像SOLID 这样的原则,它建议如何构造 实现该功能的解决方案。这个例子的字面意思是“把本来可以放在main() 中的东西放在一个类中”,这不是类应该做的。类本身在这里完全是无关紧要的,并且没有任何价值,因为它没有正确使用。
    • @kaz 可以说有史以来最好的烤面包机有 个电子设备,因为 elegant engineering。过度工程(即国王的烤面包机)与适当的工程之间存在很大差异。
    猜你喜欢
    • 2022-01-02
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2015-10-05
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多