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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2013, 16:22   #1
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию Доступ к private функциям и членам класса из дружественных функций.

Код:

#ifndef DRIB_H_
#define DRIG_H_
#include <vcl.h>

class CDrib
{
private:
        int m_nChis;
        int m_nZn;
        int gcd(int a, int b);
	int lcm(int a, int b);


public:

        CDrib();
        CDrib(int x)
        {
                m_nChis = x;
                m_nZn = x;
        }
        CDrib(int nChis, int nZn);


        ~CDrib() {};

        void Power(int x);
        void Scor();

        void Print(TEdit *ChisEdit, TEdit *ZnEdit) const;
        void Read(TEdit *ChisEdit, TEdit *ZnEdit);

        void SetChis(int x);
	void SetZn(int x);
	int GetChis() const;
	int GetZn() const;

        CDrib operator+(const CDrib &dr);
	CDrib operator-(const CDrib &dr);
	CDrib operator*(const CDrib &dr);
	CDrib operator/(const CDrib &dr);
        void operator[](int x);

        friend void operator >>(CDrib &dr, TEdit **ed);
        friend void operator <<(CDrib &dr, TEdit **ed);

        friend bool operator >(CDrib &dr1, CDrib &dr2);
        friend bool operator <(CDrib &dr1, CDrib &dr2);
        friend bool operator ==(CDrib &dr1, CDrib &Dr2);



} ;
Почему нельзя вызвать функцию lcm и почему нужно пспользовать методы для получения полей класса? Разве из дружественной функции нет прямого доступа к полям класса?
Код:
bool operator >(CDrib &dr1, CDrib &dr2)
{
        int nSpZn = lcm(dr1.GetZn(), dr2.GetZn());
        int nChis1 = nSpZn / dr1.GetZn() * dr1.GetChis();
        int nChis2 = nSpZn / dr2.GetZn() * dr2.GetChis();
	return nChis1 > nChis2;
}
[C++ Error] Drib.cpp(160): E2268 Call to undefined function 'lcm'
Pein95 вне форума Ответить с цитированием
Старый 04.04.2013, 16:36   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Функция lcm() объявлена как метод класса а вызывается как обычная функция.
waleri вне форума Ответить с цитированием
Старый 04.04.2013, 17:48   #3
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

Тогда нужно вызывать так: CDrib::lcm()?
А почему я не могу через точку получить доступ к полям класса из дружественной ф-и?
Pein95 вне форума Ответить с цитированием
Старый 04.04.2013, 18:07   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Друзья вроде не имеют доступа к привату, не?
FataLL вне форума Ответить с цитированием
Старый 04.04.2013, 18:21   #5
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

ошибся)) действительно не имеют)) Тогда значит я никак не смогу обратитса к lcm.

Последний раз редактировалось Pein95; 04.04.2013 в 18:29.
Pein95 вне форума Ответить с цитированием
Старый 04.04.2013, 21:52   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Pein95 Посмотреть сообщение
Тогда нужно вызывать так: CDrib::lcm()?
Так вызываются статические член-функции.
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработайте алгоритм и создайте программу с использованием дружественных функций и классов YaDenis Помощь студентам 1 16.01.2013 16:20
Вопрос по статическим членам класса Maygli Помощь студентам 0 25.04.2012 14:41
Написание пояснений к членам класса DronLee C# (си шарп) 5 29.11.2011 12:49
Адресация к членам класса/структур coNsept Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.03.2011 15:39