Как напечатать значение, возвращаемое методом класса

#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) не дает вызывающей стороне возможности избежать перевода строки