当在Python中定义__str__时,如何将C 的标准全局函数覆盖

How to override standard global function in c++ when called on a class just like in defining __str__ in python

本文关键字:标准 函数 全局 覆盖 Python 定义 str 当在      更新时间:2023-10-16

主要问题:

在Python中,我们可以在类中定义诸如__unicode____str__之类的内容,这样,当我们在类上调用print()str()(即str(myclass))时,我们会得到一个自定义且可读的字符串表示形式。在C 中,该课程如何完成?当我们调用string(myclass)时,我们会得到myclass的字符串表示?

背景故事:

这可能被标记为一个低质量的问题,因为我对C 非常新。

我目前正在通过练习中的C 练习进行工作,其中重点是编写代码以使提供的测试用例通过。我已经完成了39个可用练习中的30个,但是我目前已陷入此特定的测试案例代码上:

const auto actual = string(date_independent::clock::at(t.hour, t.minute));

在上一个练习中,我理解这是"创建一个名为 date_independent的命名空间,在其中有一个名称clock的类,并使该类具有名为at的公共函数,它将接受两个参数(在这种情况下2整数小时和分钟)"。我使该函数成为static函数,因为测试代码并未真正实例化时钟对象。我还将返回值为std::string类型。在最初的几个测试用例中,它运行良好。不幸的是,我遇到了此测试代码:

const auto actual = string(date_independent::clock::at(a.hour, a.minute).plus(a.add));

在这种情况下,我以前返回字符串适得其反的解决方案,因为现在我需要在at()的返回值上调用plus()函数。这显然无法完成,因为at()返回std::string,并且字符串没有成员功能。然后,我注意到有一个string()函数(?)封装了整个date_independent::clock::at(a.hour, a.minute).plus(a.add)。但是,我不确定此string()功能来自哪里,以及如何找到答案。对于Python,我认为这是某种类型铸造到字符串中,或其他一些名为String的函数。但是,这是C ,我还没有遇到这样的打字,所以也许不是。我的另一个想法是,与Python类似,也许类可以覆盖标准全局功能如何与之合作。就像在Python类中定义__unicode____str__何时可以返回自定义值。

因此,我的问题再次是,我的假设是该string函数应该是一个成员函数,该函数应被覆盖正确吗?如果是这样,如何在C 中完成?我很感谢任何回答。我可以肯定的是,我没有看到一些基本的东西,因为我是该语言的新手。

下面找到测试代码的某些上下文。

...
BOOST_AUTO_TEST_CASE(time_tests)
{
    for (timeTest t : timeCases) {
        const auto actual = string(date_independent::clock::at(t.hour, t.minute));
        BOOST_REQUIRE_MESSAGE(t.expected == actual, errorMsg(t.expected, actual, t.msg));
    }
}
...
BOOST_AUTO_TEST_CASE(add_tests)
{
    for (addTest a : addCases) {
        const auto actual = string(date_independent::clock::at(a.hour, a.minute).plus(a.add));
        BOOST_REQUIRE_MESSAGE(a.expected == actual, errorMsg(a.expected, actual, a.msg));
    }
}
...

如果要在控制台中输出类或将其写入文件,则必须覆盖类的<<操作员。

std::ostream& operator<<(std::ostream& os, const person& person)
{
    return os << person.first_name << " " << person.last_name;
}

如果您只想要std::string,只需添加一个返回类的字符串reententation的to_string方法。

class person
{
public:
    std::string to_string() const
    {
        return first_name + " " + last_name;
    }
private:
    std::string first_name;
    std::string last_name;
};