【问题标题】:Operator issues with coutcout 的操作员问题
【发布时间】:2011-02-13 16:18:17
【问题描述】:

我有一个简单的包类,它被重载了,所以我可以简单地用 cout

protected:
    string name;
    string address;
    double weight;
    double shippingcost;

ostream &operator<<( ostream &output, const Package &package )
{
    output << "Package Information ---------------";
    output << "Recipient: " << package.name << endl;
    output << "Shipping Cost (including any applicable fees): " << package.shippingcost;

第 4 行出现问题(输出

我猜这与数据类型是包名称的字符串有关。有什么想法吗?

【问题讨论】:

  • 您使用的是 std::string 还是其他字符串库?
  • Using string.h #include 它在我的这个类的 .h 和 .cpp 文件中。还使用命名空间 std(尽管其他行应该清楚这一点)。
  • 使用&lt;string&gt; - &lt;string.h&gt; 是非标准的,可能会做一些奇怪的事情。 &lt;iostream&gt; 等也是如此。
  • 您是否尝试过包含#include ?
  • @gf:我认为 string.h 是标准的。然而,与 C 兼容的不是 .h 版本的字符串,而是 .h 版本的 cstring。

标签: c++ polymorphism overloading cout


【解决方案1】:

您必须包含错误的字符串标题。 &lt;string.h&gt; 和 &lt;string&gt; 是两个完全不同的标准头。

#include <string.h> //or in C++ <cstring>

这适用于 C 风格的以空字符结尾的字符数组的函数(如 strcpy、strcmp 等)。 cstring reference

#include <string>

这是给std::string的。 string reference

【讨论】:

    【解决方案2】:

    您可能缺少#include &lt;string&gt;。

    【讨论】:

    • 我有#include 而不是#include 。
    【解决方案3】:

    尝试在类声明中将operator&lt;&lt; 声明为friend:

    struct Package
    {
    public:
        // Declare {external} function "operator<<" as a friend
        // to give it access to the members.
        friend std::ostream& operator<<(std::ostream&, const Package& p);
    
    protected:
        string name;
        string address;
        double weight;
        double shippingcost;
    };
    
    std::ostream&
    operator<<(std::ostream& output, const Package& package)
    {
        output << "Package Information ---------------";
        output << "Recipient: " << package.name << endl;
        output << "Shipping Cost (including any applicable fees): " << package.shippingcost;
        return output;
    }
    

    顺便说一句,使用与数据类型同名的变量名是非常糟糕的形式,除了不同的大小写。这对搜索和分析工具造成了严重破坏。此外,拼写错误也会产生一些有趣的副作用。

    【讨论】:

    • 我不同意变量名不应该与类同名,事实上,如果它是类的一个实例,它是一个非常好的名字!有哪些搜索和分析工具不接受大多数编程语言都区分大小写这一事实?
    【解决方案4】:

    用它来输出字符串..

    输出

    【讨论】:

    • 不,这不应该是必要的 - std::string 的重载由标准库提供。
    • 你实际上不需要c_str(),除非你想要一个char*,可能将它传递给一个C风格的函数(例如printf)。 -1
    • 知道了!抱歉不知道这个。谢谢!
    • 但是,如果 OP 没有预期的 string 定义,这样的事情可能/将突出显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多