类中的字符串 // C++

Posted

技术标签:

【中文标题】类中的字符串 // C++【英文标题】:Strings in classes // C++ 【发布时间】:2011-12-20 21:35:14 【问题描述】:

我是 C++ 新手,在类中遇到字符串问题

日期.cpp:

#include "stdafx.h"
#include "Date.h"
#include <sstream>
#include <string>

using namespace std;

Date::Date(int day,int month,int year )

    setDate(day,month,year);


void Date::setDate(int day,int month,int year)

    this->day = day;
    this->month = month;
    this->year = year;


string Date::printIt()

    std::stringstream res;

    res<<this->day<<"/";
    res<<this->month<<"/";
    res<<this->year;

    return res.str;


Date operator+(const Date &date,int day)

    Date newDate(date.day,date.month,date.month);

    newDate.day += day;

    if(newDate.day > 30)
    
        newDate.day%=30;
        newDate.month+=1;

        if(newDate.month>=12)
        
            newDate.month%=30;
            newDate.year+=1;
        
    

    return newDate;

日期.h:

#ifndef DATE_H
#define DATE_H 

using namespace std;

class Date

private:
    int day,month,year;

    Date()

public:
    Date(int day,int month,int year);

    void setDate(int day,int month,int year);
    string printIt();

    friend Date operator+(const Date &date, int day);
;


#endif

问题是printIt() 函数。 Visual Studio 说声明不兼容。当我将函数类型更改为int 时,问题消失了,但为什么strings 出现问题?

【问题讨论】:

我没有看到您的字符串问题?代码示例是否显示了问题? 您必须在使用之前包含&lt;string&gt;。编译器会逐行读取文件,不会为你往前看。 永远不要将using namespace放在标题中,正如前面的评论所说,您需要在Date.h中添加#include &lt;string&gt;,然后在std::string printIt();中添加std::string printIt(); 【参考方案1】:

如果Date.h 将使用string 类,则必须在之前 Date.hin Date.h 中包含必要的头文件.

【讨论】:

非常感谢您的关心,也感谢其他人。问题是这样的。【参考方案2】:

您的问题在于您的包含订单:

#include "stdafx.h"
#include "Date.h"
#include <sstream>
#include <string>

在包含定义string 的标头之前,您将包含Date.h,其中包含string

应该是

#include "stdafx.h"
#include <sstream>
#include <string>
#include "Date.h"

或者更好的是,直接在标题中包含string。这样您就不必担心可能包含标头的其他 cpp 文件中的顺序。

【讨论】:

您不应该依赖包含头文件的顺序...更喜欢您提供的第二种解决方案。【参考方案3】:

您正在返回指向str 成员函数的指针,而不是string。请致电 str() 以使其正常工作

string Date::printIt()

    ...

    return res.str();//call str method

还需要将#include &lt;string&gt; 移动到头文件,因为string 用于printIt 的返回类型。

【讨论】:

res.str 是否表示方法指针? res::str 不是指针吗?我认为 res.str 会给出不同的错误 - 可能只是一个错字。 嗯...如果您已经编译过,您会发现这不是问题所在。我的意思是这是一个问题,但不是他问题的原因。无论如何,你是对的,不值得 -1,但也不值得 +1,因为它没有回答问题。作为评论,这会更好。 @LuchianGrigore 这里显然有两个问题,我真的怀疑这是一个错字,除非 OP 决定手动输入所有内容,而不仅仅是从编辑器中进行简单的复制和粘贴。答案是 Davids 和我的组合 :),我会将它添加到我的,但 +1 给 Davids【参考方案4】:

重新排列标题,使字符串类型声明出现在 Date.h 之前

#include <sstream>
#include <string>
#include "stdafx.h"
#include "Date.h"

【讨论】:

以上是关于类中的字符串 // C++的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中的类中返回对象的字符串? [关闭]

在 C++ 类中引用向量

Visual C++ 2010 接受字符串作为重载函数中的 bool

在 C++ 类中定义静态字符串变量

严重包含在字符串中,除非我将它存储在 C++ 类中

string类中的size()函数和length()函数的区别?