2016-02-14 4 views
-1

Поэтому я должен тестировать эту программу для проверки ошибок, чтобы убедиться, что даты действительны. Все работало, когда я только использовал cout, но мне нужно отправить вывод или сообщения об ошибках в файл.Проблемы с передачей потока в качестве параметра

Меня беспокоит только класс validDate, класс dateType отлично работает. Я пробовал передать ostream& myOutput в качестве параметра для void validDate::setDate(int month, int day, int year), но мне пришлось бы изменить параметры для validDate, которые не закончили работать для меня. Любые идеи были бы замечательными.

#include <fstream> 
#include <iostream> 
using namespace std; 

class dateType { 
public: 
dateType(int month = 1, int day = 1, int year = 0); 
void setDate(int month, int day, int year); 
int getDay() const; 
int getMonth() const; 
int getYear() const; 
void printDate(ostream& myOutput) const; 

protected: 
int dMonth; 
int dDay; 
int dYear; 
}; 

class validDate:public dateType { 
public: 
validDate(int month = 1, int day = 1, int year = 0); 
void setDate(int month, int day, int year, ostream& myOutput); 
ostream& myOutput; 
}; 

int main() { 
ofstream myOutput("outfile"); 
if (myOutput.fail()) { 
    return -1; 
} 

validDate badDay; 
myOutput << "\n\nvalidDate badDay;\n"; 
myOutput << "--------------------\n"; 
badDay.setDate(2, 29, 2015); 


myOutput.close(); 
system("pause"); 
return 0; 
} 

dateType::dateType(int month, int day, int year) 
{ 
dMonth = month; 
dDay = day; 
dYear = year; 
} 

void dateType::setDate(int month, int day, int year) 
{ 
dMonth = month; 
dDay = day; 
dYear = year; 
} 
int dateType::getDay() const 
{ 
return dDay; 
} 
int dateType::getMonth() const 
{ 
return dMonth; 
} 
int dateType::getYear() const 
{ 
return dYear; 
} 
void dateType::printDate(ostream& myOutput) const 
{ 
myOutput << dMonth << "-" << dDay << "-" << dYear; 
} 

validDate::validDate(int month, int day, int year) 
{//GETTING ERROR HERE, C2512 no appropriate default constructor available 
streambuf myOutput; 
setDate(month, day, year, myOutput); 
} 
void validDate::setDate(int month, int day, int year, ostream& myOutput) { 
if (year < 0) { 
    myOutput << "Error: Year must be greater than 0." << endl; 
} 
else 
    switch (month) 
{ 
    case 4: 
    case 6: 
    case 9: 
    case 11: 
     if ((day < 0) || (day > 30)) { 
      myOutput << "Error: Month must have between 1-30 days." << endl; 
     } 
     break; 
    case 1: 
    case 3: 
    case 5: 
    case 7: 
    case 8: 
    case 10: 
    case 12: 
     if ((day < 0) || (day > 31)) { 
      myOutput << "Error: Month must have between 1-31 days." << endl; 
     } 
     break; 
    case 2: 
     if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { 
      myOutput << "Error: Month must have between 1-29 days since it 
      is a leapyear." << endl; 
     } 
     else { 
      myOutput << "Error: Month must have between 1-28 days." << endl; 
     } 
     break; 
    default: 
     myOutput << "Error: Invalid Month." << endl; 
    } 

    } 
+0

добро пожаловать в переполнение стека! добавьте свой язык (C++) в качестве тега. большинство людей будут искать только те метки, с которыми они знакомы, поэтому люди, которые знают C++, не могут найти ваш вопрос. также исправьте свой отступ, так как трудно прочитать свой код. –

+0

'std :: ostream' не имеет конструктора по умолчанию [http://www.cplusplus.com/reference/ostream/ostream/ostream/). При построении требуется аргумент 'streambuf'. –

+0

Передайте 'ofstream' в качестве эталонного параметра. Поскольку вы предоставили значения по умолчанию для других параметров в конструкторе, парам 'ofstream' придется идти первым. Нет разумного значения по умолчанию, которое вы могли бы использовать для него. Также наблюдайте, что вы переопределяете функцию 'setDate', но не объявляете ее виртуальной в' dateType'. –

ответ

0

streambuf myOutput; является ошибкой. Как правило, вы не объявляете никаких переменных типа streambuf в своем собственном коде; они используются внутри потоками.

Я не уверен, что вы пытаетесь сделать, но некоторые другие варианты включают:

setDate(month, day, year, std::cout); 

или

std::ostringstream oss; 
setDate(month, day, year, oss); 
// do something with oss.str() 

Другая проблема заключается в том, что класс имеет validDate член класса:

ostream& myOutput; 

Ошибка компиляции заключается в том, что вы должны предоставить инициализатор для ссылочных элементов. Мне кажется, что это ошибка; Я бы посоветовал просто удалить эту линию.

+0

все еще получает ту же ошибку, не уверен, почему. – Kryptochris

+0

@ Kryptochris обновил мой ответ –