Строки в классах // C ++ - PullRequest
       1

Строки в классах // C ++

1 голос
/ 21 декабря 2011

Я новичок в C ++ и беспокоюсь о строках в классах

Date.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;
}

Date.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, проблема исчезает, но почему возникает проблема с string s?

Ответы [ 4 ]

5 голосов
/ 21 декабря 2011

Если Date.h будет использовать класс string, то необходимые файлы заголовков должны быть включены либо до Date.h, либо в Date.h.

3 голосов
/ 21 декабря 2011

Ваша проблема с вашим заказом на включение:

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

Вы включаете Date.h, который содержит string, перед тем, как включить заголовок, который определяет string.

Это должно быть

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

или, что еще лучше, включить string непосредственно в заголовок.Это позволяет вам не беспокоиться о порядке в других cpp файлах, где вы можете включить заголовок.

1 голос
/ 21 декабря 2011

Вы возвращаете указатель на функцию-член str вместо string. Звоните str(), чтобы это заработало

string Date::printIt()
{
    ...

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

Также вам нужно переместить #include <string> в заголовочный файл, поскольку string используется для типа возврата printIt.

0 голосов
/ 21 декабря 2011

Изменение порядка заголовков, чтобы объявление типа строки отображалось до Date.h

#include <sstream>
#include <string>
#include "stdafx.h"
#include "Date.h"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...