【问题标题】:How to create static pure virtual methods in C++?如何在 C++ 中创建静态纯虚方法?
【发布时间】:2020-04-29 14:09:39
【问题描述】:

我正在尝试组织一个 Visual Studio 项目,该项目将包含我对 Project Euler 问题 (Project Euler) 的所有解决方案。我希望每个问题都有一个单独的目录 (problemX),其中包含解决此问题所需的所有文件。该目录还将包含一个名为ProblemX 的文件(X 是问题的编号),该文件将是给定问题的“主”文件。然而,这是我的问题:我想为这个文件创建一个“模板”。当我没有在 ProblemX 文件中创建 solve() 函数时,我希望编译器给我一个错误。这是如何实现的?我知道 C++ 中确实存在抽象类,并且我可以使用抽象方法 solve() 创建一个父类 Problem,然后我可以在我的 ProblemX 文件中从这个类继承。但是,这只适用于非静态方法。我还希望有一个主文件,我可以从中调用solve() 方法,而无需在调用solve() 方法之前实例化每个ProblemX 类。我将如何解决这个问题?我也对如何组织我的解决方案持开放态度,但我也想知道这个问题的解决方案,因为我将来可能会再次遇到这个问题。

【问题讨论】:

  • 没有静态虚拟方法这样的东西。 virtual 的全部要点是根据调用函数的对象的动态类型来选择实现。 static 的全部意义在于该函数不需要调用对象。
  • 对我来说听起来是个坏主意。为什么不为每个问题创建一个可执行文件?
  • 感谢您的回答。 @IgorTandetnik 我不明白你对 virtual 是什么意思的解释。
  • @JesperJuhl 实际上,我不知道。我以为这太复杂了。但我可能会试一试。谢谢。
  • 为什么你更喜欢打电话给ProblemX::solve();(不能是virtual)而不是ProblemX().solve();(可以是virtual)?示例:godbolt.org/z/mfCqNZ

标签: c++ class inheritance static virtual-functions


【解决方案1】:

Ted Lyngmo 的这段代码正是我所需要的:

#include <iostream>

struct IProblem {
    virtual bool solve() = 0;
    virtual ~IProblem() = default;
};

struct Problem1 : IProblem {
    bool solve() override {
        return true;
    }
};

struct Problem2 : IProblem {
    bool solve() override {
        return false;
    }
};

int main() {
    std::cout
        << std::boolalpha
        << Problem1().solve() << '\n'
        << Problem2().solve() << '\n';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2011-09-08
    • 2011-06-24
    • 2011-12-12
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多