#c #class #methods #cout
#c #класс #методы #cout
Вопрос:
У меня возникли проблемы с печатью значения, возвращаемого методом класса. В экземпляре DataClass cout будет печатать элемент данных (int), используя инструкцию вида:
cout << dataClassInstance.getDataMember();
Однако ListEntry, который содержит класс данных в качестве члена, не может напечатать это же значение, используя свою собственную функцию. Форма является:
cout << listEntryInstance.getDataClass();
ListEntry использует свою собственную функцию get, которая вызывает функцию get DataClass для возврата того же значения int, но вместо этого выдает ошибку:
[Ошибка] нет соответствия для ‘operator<<‘ (типами операндов являются ‘std::basic_ostream’ и ‘DataClass’)
Любые идеи о том, что я делаю неправильно, были бы высоко оценены. Кажется, я не могу найти никаких решений из того, что я рассмотрел до сих пор.
class DataClass
{
private:
dataType dataMember;
public:
//default
DataClass()
{
dataMember;
}
//parameterized
DataClass(dataType inputData)
{
dataMember = inputData;
}
//copy
DataClass(const DataClass amp;inputData)
{
dataMember = inputData.dataMember;
}
//destructor
~DataClass()
{
}
//set
void setData(dataType inputData)
{
dataMember = inputData;
}
//get
dataType getDataMember()
{
return dataMember;
}
};
class ListEntry
{
private:
DataClass data;
ListEntry* nextEntryPtr;
ListEntry* prevEntryPtr;
public:
//default
ListEntry() : data()
{
nextEntryPtr = NULL;
prevEntryPtr = NULL;
}
//parameterized
ListEntry(const DataClassamp; inputData) : data(inputData)
{
nextEntryPtr = NULL;
prevEntryPtr = NULL;
}
//copy
ListEntry(const ListEntryamp; entryToCopy) : data(entryToCopy.data)
{
nextEntryPtr = NULL;
prevEntryPtr = NULL;
}
//destructor
~ListEntry()
{
}
//set
void setDataClass(DataClass dataInput)
{
data.setData(dataInput.getDataMember());
}
void setNextEntry(ListEntry* entryPtr)
{
nextEntryPtr = entryPtr;
}
void setPrevEntry(ListEntry* entryPtr)
{
prevEntryPtr = entryPtr;
}
//get
DataClass getDataClass()
{
return data.getDataMember();
}
ListEntry* getNextEntry()
{
return nextEntryPtr;
}
ListEntry* getPrevEntry()
{
return prevEntryPtr;
}
};
Пример кода, который я использую для тестирования функциональности каждого класса. DataClass выдает ожидаемые результаты, ListEntry выдает только ошибку.
//STUB TEST FOR DATACLASS
dataType constructTest = 42;
cout << "Creating DataClass with default constructor."
<< endl;
DataClass defaultTestData; //default initialize
cout << "Value held in DataClass: "
<< defaultTestData.getDataMember()
<< endl << endl;
//STUB TEST FOR LISTENTRY
cout << "Creating list entry with default constructor." << endl;
ListEntry defaultEntry;
cout << "Value held in list entry:"
<< defaultEntry.getDataClass()
<< endl << endl;
Ответ №1:
Вы пытаетесь напечатать DataClass
, а не его элемент. Для этого класса вы не указали, как его печатать (путем перегрузки <<
оператора). Это то, на что жалуется компилятор.
То, что вы хотите, вероятно,
cout << listEntryInstance.getDataClass().getDataMember();
Комментарии:
1. Этот фрагмент кода действительно компилируется, но я получаю номера мусора для обоих конструкторов по умолчанию
DataClass
иListEntry
. Ранее я получал правильный вывод, поэтому, должно быть, я что-то изменил. Собираюсь провести некоторое расследование.
Ответ №2:
Оператор вставки потока не перегружен для DataClass
friend std::ostream amp;operator<<(std::ostream amp;out, const DataClass amp;dc) {
out << dc.dataMember;
return out;
}
Комментарии:
1. Я понимаю… это имеет смысл. Я пошел дальше и перегрузил оператор << для DataClass, но компилятору это не понравилось. Это говорит о том, что элемент данных является закрытым в контексте
out << dc.dataMember << std::endl;
. Я попытался использоватьdc.getDataMember
, поскольку это общедоступный метод, и он также не компилируется.2. Использование endl в operator<< является плохой практикой по двум причинам: (1) это принудительный сброс, который может замедлить код; (2) не дает вызывающей стороне возможности избежать перевода строки