2011-12-20 4 views
1

Я новичок в C++ и беспокойство со строками в классахСтроки в классах // 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?

+0

Я не вижу проблемы со строками? Является ли пример кода проблемой? –

+1

Вы должны включить '' перед тем, как использовать его. Компилятор читает файл строки за строкой и не будет смотреть за вами. – kichik

+3

Никогда не добавляйте 'use namespace' в заголовок, и, как говорится в предыдущем комментарии, вам нужно' #include 'в' Date.h', а затем 'std :: string printIt();' – Barry

ответ

3

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

#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

Вам не нужно полагаться на то, с каким заголовком вы включаете заголовок файлы ... предпочитают второе решение, которое вы предоставили. – Marlon

5

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

+0

спасибо так много для вашей заботы, а также благодаря другим. Проблема в том, что. – mayy00

1

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

string Date::printIt() 
{ 
    ... 

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

Кроме того, необходимо переместить #include <string> в файл заголовка, так как string используется для типа возвращаемого printIt.

+0

Обозначает ли res.str указатель метода? Не является ли res :: str указателем? Я думаю, что res.str даст другую ошибку - может быть, просто опечатка. –

+0

+ 1'd, поскольку есть действительно опечатка;) – Barry

+0

Ну ... если бы вы собрали, вы бы увидели, что это не проблема. Я имею в виду, что это была проблема, но не причина его проблемы. Независимо от того, вы правы, не стоит -1, но и не +1, так как он не отвечает на вопрос. Это было бы лучше как комментарий. –

0

Reorder вас заголовки так, что декларация типа строка появляется перед Date.h

#include <sstream> 
#include <string> 
#include "stdafx.h" 
#include "Date.h" 
Смежные вопросы