Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2015, 22:16   #1
lightfrag
 
Регистрация: 19.10.2015
Сообщений: 5
Сообщение Опережающее объявление

Всем привет.

Есть вопрос по поводу определения переменной структуры, и позднее определением самой структуры:

Код:
class compensation
{
	private:
		double amount;
		Tperiod period;

	public:
		enum Tperiod { MONTHLY, WEEKLY, HOURLY };

		compensation(): period(MONTHLY), amount(0.) {}
		compensation(Tperiod period, amount = 0.):
			period(period), amount(amount)
		{ }

	protected:
		void getdata()
		{
			cout << " Введите тип оплаты (прим. почасовая,"
				"понедельная, помесячаня):\n";
			string str;
			getline(cin, str);

			while(true){
				fflush(stdin);

				if(!str.compare("почасовая")){
					period = HOURLY;
					break;
				} else if(!str.compare("понедельная")){
					period = WEEKLY;
					break;
				} else if(!str.compare("помесячаня")){
					period = MONTHLY;
					break;
				} else
					cout << "Ошибка ввода!" << endl;

			}

			cout << "Введите сумму оплаты: "; cin >> amount;


		}

		void putdata() const
		{
			cout << "\nТип оплаты: ";
				switch(period){
					case HOURLY:
						cout << "почасовая\n";
						break;
					case WEEKLY:
						cout << "понедельная\n";
						break;
					case MONTHLY:
						cout << "помесячаня\n";
						break;
				}

			cout << "Сумма оплаты: " << amount << endl;
		}

		inline double getAmount() const { return amount; }
		inline void setAmount(double cost) { this->amount = cost; }
		inline Tperiod getPeriod() const { return period; }
		inline void setPeriod(Tperiod period) { this->period = period; }
};
Как оставить текущей вопрос инкапсуляции и принадлежности к классу описанной структуры и при этом что бы компилировалось?
Вариации с порядком private-public не прокатывают, начинает цепляться к второй переменной участвующей в конструкторе.

Последний раз редактировалось lightfrag; 19.10.2015 в 22:48. Причина: букву дописал
lightfrag вне форума Ответить с цитированием
Старый 19.10.2015, 22:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
Вариации с порядком private-public не прокатывают, начинает цепляться к второй переменной участвующей в конструкторе.
Все проканывает. Вы просто забыли тип у параметра указать, вот и придерается.
p51x вне форума Ответить с цитированием
Старый 19.10.2015, 22:46   #3
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Как оставить текущей вопрос инкапсуляции и принадлежности к классу описанной структуры и при этом что бы компилировалось?
Что мешает сделать так:
Код:
    public:
        enum Tperiod { MONTHLY, WEEKLY, HOURLY };
	private:
		double amount;
		Tperiod period;
    //...

что касается конструктора, то у Вас тип параметра amount пропущен, исправьте:
Код:
		compensation(Tperiod period, double amount = 0.):
Также поменяйте amount(amount) и period(period) местами:
Код:
		compensation(): amount(0.), period(MONTHLY) {}
		compensation(Tperiod period, double amount = 0.):
			amount(amount), period(period)
		{ }
С учетом изменений в конструкторах можно и секции местами поменять.
Итого.
вариант 1:
Код:
class compensation
{
	public:
        enum Tperiod { MONTHLY, WEEKLY, HOURLY };
		compensation(): amount(0.), period(MONTHLY) {}
		compensation(Tperiod period, double amount = 0.):
			amount(amount), period(period)
		{ }

	protected:
		void getdata()
		{
			cout << " Введите тип оплаты (прим. почасовая,"
				"понедельная, помесячаня):\n";
			string str;
			getline(cin, str);

			while(true){
				fflush(stdin);

				if(!str.compare("почасовая")){
					period = HOURLY;
					break;
				} else if(!str.compare("понедельная")){
					period = WEEKLY;
					break;
				} else if(!str.compare("помесячаня")){
					period = MONTHLY;
					break;
				} else
					cout << "Ошибка ввода!" << endl;

			}

			cout << "Введите сумму оплаты: "; cin >> amount;


		}

		void putdata() const
		{
			cout << "\nТип оплаты: ";
				switch(period){
					case HOURLY:
						cout << "почасовая\n";
						break;
					case WEEKLY:
						cout << "понедельная\n";
						break;
					case MONTHLY:
						cout << "помесячаня\n";
						break;
				}

			cout << "Сумма оплаты: " << amount << endl;
		}

		inline double getAmount() const { return amount; }
		inline void setAmount(double cost) { this->amount = cost; }
		inline Tperiod getPeriod() const { return period; }
		inline void setPeriod(Tperiod period) { this->period = period; }
	private:
		double amount;
		Tperiod period;
};
Вариант 2:
Код:
class compensation
{
	public:    
        	enum Tperiod { MONTHLY, WEEKLY, HOURLY };
	private:
		double amount;
		Tperiod period;
	public:
		compensation(): amount(0.), period(MONTHLY) {}
		compensation(Tperiod period, double amount = 0.):
			amount(amount), period(period)
		{ }

	protected:
		void getdata()
		{
			cout << " Введите тип оплаты (прим. почасовая,"
				"понедельная, помесячаня):\n";
			string str;
			getline(cin, str);

			while(true){
				fflush(stdin);

				if(!str.compare("почасовая")){
					period = HOURLY;
					break;
				} else if(!str.compare("понедельная")){
					period = WEEKLY;
					break;
				} else if(!str.compare("помесячаня")){
					period = MONTHLY;
					break;
				} else
					cout << "Ошибка ввода!" << endl;

			}

			cout << "Введите сумму оплаты: "; cin >> amount;


		}

		void putdata() const
		{
			cout << "\nТип оплаты: ";
				switch(period){
					case HOURLY:
						cout << "почасовая\n";
						break;
					case WEEKLY:
						cout << "понедельная\n";
						break;
					case MONTHLY:
						cout << "помесячаня\n";
						break;
				}

			cout << "Сумма оплаты: " << amount << endl;
		}

		inline double getAmount() const { return amount; }
		inline void setAmount(double cost) { this->amount = cost; }
		inline Tperiod getPeriod() const { return period; }
		inline void setPeriod(Tperiod period) { this->period = period; }
};
Croessmah вне форума Ответить с цитированием
Старый 19.10.2015, 23:07   #4
lightfrag
 
Регистрация: 19.10.2015
Сообщений: 5
По умолчанию

В первую очередь спасибо за ответы!
Ошибка тупая =( видиом конец дня.

Цитата:
Также поменяйте amount(amount) и period(period) местами:
Код:
Код:

		compensation(): amount(0.), period(MONTHLY) {}
		compensation(Tperiod period, double amount = 0.):
			amount(amount), period(period)
		{ }
А это имеет значение?
Что-то читал про кратность 4-м при размещении переменных в структуре (класс ведь то же самое, с программной т.з.), но там не должно зависить от порядка инициализации перед выполнением тела конструктора.
lightfrag вне форума Ответить с цитированием
Старый 19.10.2015, 23:13   #5
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
А это имеет значение?
В данном случае нет, но сначала будет инициализироваться amount, только потом period. Этот порядок зависит от порядка объявления этих переменных в классе, а не от их порядка в списке инициализации. Нормальный компилятор в случае не соответствия порядка объявления и перечисления в списке инициализации будет сыпать варнинги, а оно Вам нужно?
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявление deatheven15 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 12.03.2014 18:23
Visual C++ опережающее описание. studen Помощь студентам 2 23.11.2012 18:21
Рекурсия и опережающее описание McJordan Помощь студентам 4 17.08.2010 19:28
Рекурсия и опережающее описание DrDre9991 Паскаль, Turbo Pascal, PascalABC.NET 3 22.06.2010 21:14