После того, как вы просто научились каскадировать множественные вызовы функций мутатора, определяя эти функции с типом возвращаемого типа "ссылка на объект класса С" (т.е. C & setHeight (int)) в сочетании с соответствующими "return * this" утверждениями, я бы очень очень хотелось бы знать, позволяет ли подобный метод возвращать члены данных объекта из одной функции "get".
У меня есть простой класс "счет-фактура" с объектом из другого класса "Дата". Этот объект-член данных содержит личные данные, которые хранят стандартную дату "даты покупки" гипотетического продукта (для которого был создан объект). Хотя в "Дате" три члена int хранят компоненты даты, я хотел бы как-то каскадировать вызовы к трем соответствующим функциям get, принадлежащим объекту Date, в моем аксессуре "даты покупки", поскольку появляется какой-то один accessor/get и потому, что этот стиль кажется предпочтительным для выполнения задачи с помощью инструкции cout. Другими словами, если для отображения полной даты необходимо использовать некоторую функцию get, я бы предпочел, чтобы она была отформатирована с одним вызовом в заявлении печати на клиенте (main), а не функцией, которая просто печатает форматированный оператор при вызове из main.
//Invoice.h
#ifndef DATE_H
#define DATE_H
#include "Date.h"
...using namespace std. (Assume all other necessary libraries, classes, are included)
class Invoice {
public:
Invoice(); // Default constructor
Invoice( Date &, string );
setDateOfPurchase( int, int, int );
getDateOfPurchase();
private:
Date DateOfPurchase;
string description;
}; // end class definition
#endif
Определение функции члена ниже...
//Invoice.cpp
#include "Date.h"
(Again, please assume the necessary inclusions are made here)
Invoice::Invoice(){
DateOfPurchase.month = 1;
DateOfPurchase.day = 1;
DateOfPurchase.year = 1999;
} // end Default constructor definition
Invoice::Invoice( Date &purchaseDate, string desc ):
DateOfPurchase( purchaseDate ),
description( desc )
{} // No body
Invoice &Invoice::setDateOP( int m, int d, int y ) {
// The Date class definition is not explicitly defined; please assume these simply accept
// one int argument each.
DateOfPurchase.setMonth( m );
DateOfPurchase.setDay( d );
DateOfPurchase.setYear( y );
return *this;
} // End mutator definition
Заголовок для моей функции доступа, предназначенный для получения полной даты, хранящейся в объекте DateOfPurchase, выглядит следующим образом:
Invoice &Invoice::getDateOrd(){
//gets month, day, and year, possibly through utilizing dereferenced 'this' pointer (*this)
} // end getDateOrd definition
функция main ниже...
В основном://Создание объекта Date, который будет передаваться по ссылке на конструктор счета-фактуры. Дата сегодня (11, 10, 2014);
Invoice firstSale( today, A corkscrew: product# 88090 );
// Cascading call to each member function of *member data object* DateOfPurchase
firstSale.setMonth( 11 ).setDay( 12 ).setYear( 2014 );
Надеемся, это продемонстрирует базовое приложение каскадного вызова с "заданными" функциями. Теперь для "получить" функции... (Кстати, я использую Deitel & Deitel, 2013, 7-е издание)
Использовать << перегрузка оператора в классе Invoice
добавьте приведенный ниже код в свой класс Invoice.
friend ostream &operator<<( ostream &output,
const Invoice &invoice )
{
output << "F : " << invoice.DateOfPurchase.dd << " " << invoice.DateOfPurchase.mm<<" "<<invoice.DateOfPurchase.yy;
return output;
}
Вы можете напрямую позвонить как
Invoice invoice;
cout<<invoice;
Надеюсь, что это решит вашу проблему.