Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование функций одного класса другим, friend class 
:(
    Опции темы
TheDestroyer
Дата 20.7.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Здравствуйте, помогите пожалуйста разобраться с использованием функций одного класса другим. Например, нужно использовать функцию func1 класса Class2 в классе Class1:
Код

class Class1
{
string func(string val);
};

void Class1::func(string val)
{
...
string st = func1("123"); // <==!
}

class Class2
{
friend class Class1;
string func1(const string &val);
string func2(const string &val);
};

Объявление класса Class1 другом класса Class2 не помогает, либо я неправильно обращаюсь к функции func1() в классе Class1.
Как правильно это сделать?
PM MAIL   Вверх
mekhanikus
Дата 20.7.2009, 13:30 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: нет
Всего: 1



Попробуй так:

Код

class Class2
{
friend class Class1;
string func1(const string &val);
string func2(const string &val);
};

class Class1
{
string func(string val);
};

void Class1::func(string val)
{
...
string st = Class2::func1("123");
}

PM MAIL   Вверх
mes
Дата 20.7.2009, 13:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(mekhanikus @  20.7.2009,  12:30 Найти цитируемый пост)
Попробуй так:

не-статические функции класса нельзя вызывать без указания объекта.

P.S.и для начала постарайтесь разобраться что такое класс, а что такое объект - без этого дальнейшее изучение  ООП в Cpp будет затруднительным.

Это сообщение отредактировал(а) mes - 20.7.2009, 13:36


--------------------
PM MAIL WWW   Вверх
TheDestroyer
Дата 20.7.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Сделал так:
Код

class Class2;
class Class1
{
string func(string val);
};
void Class1::func(string val)
{
...
string st = func1("123"); // <==!
}
class Class2
{
friend class Class1;
string func1(const string &val);
string func2(const string &val);
};

Не помогло. 
Ошибка: func1: идентификатор не найден
PM MAIL   Вверх
zim22
Дата 20.7.2009, 13:37 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(TheDestroyer @  20.7.2009,  13:17 Найти цитируемый пост)
Как правильно это сделать?

Код

class Class2 {    
  friend class Class1;  
  static string func1(const string &val) { return ""; }
  string func2(const string &val);
};

class Class1 {  
  void func(string val);
};

void Class1::func(string val) {
  string st = Class2::func1("123"); // <==!
}

***
Цитата(mes @  20.7.2009,  13:33 Найти цитируемый пост)
не-статические функции класса нельзя вызывать без указания объекта.

можно. только извращённо.
Код

struct C {
  void print() { std::cout << "yo"; }
};
((C*)0)->print();

но при этом мы теряем доступ к указателю this.

Это сообщение отредактировал(а) zim22 - 20.7.2009, 13:43


--------------------
PM MAIL   Вверх
TheDestroyer
Дата 20.7.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Спасибо, дело было в объявлении функции статической.
PM MAIL   Вверх
mes
Дата 20.7.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  20.7.2009,  12:37 Найти цитируемый пост)
можно. только извращённо.

нда..
Цитата(zim22 @  20.7.2009,  12:37 Найти цитируемый пост)
((C*)0)->print();

 a это разве не указатель на объект (хоть и невалидный) ?!

P.S. и в теме для новичков подобные извращения, к тому же неправильно преподнесенные, имхо, излишние. 

Это сообщение отредактировал(а) mes - 20.7.2009, 14:46


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 20.7.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(TheDestroyer @ 20.7.2009,  14:02)
Спасибо, дело было в объявлении функции статической.

Статическая функция - одна для всех экземпляров одинакового типа во всей программе. Надеюсь из следующего куска кода будет понятно в чём именно отличие static функций-членов (static методов класса).
Код

class C{
private:
   int data;

public:
   void set(int val){
      this->data = val; // всегда неявно передаётся указатель на объект для которого вызван метод
   }
   static void sta_set(C* that, int val){
      that->data = val; // вместо неявного this, передаём указатель that вручную, при каждом вызове.
   }
};


Вызываются они вот так:
Код

int main(int argv, char* argc[]){
   C obj;
   obj.set(1); // вызова "обычного" метода класса
   C::sta_set(&obj, 1); // вызов статического метода класса
   // в обоих случаях результат один и тот же

   return 0;
};


Если же в функцию static void sta_set(C* that, int val) не передавать указатель/ссылку that (любым способом) то эта функция не будет иметь доступа ни к одному созданному объекту класса (инстансу класса) и, соответственно, к его членам. Она будет иметь доступ только к статическим данным этого класса.

Это сообщение отредактировал(а) Леопольд - 20.7.2009, 19:27


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 20.7.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Вот пример с "дружелюбными" классами. Функции "работают" идентично.
Код

class D;
class C{
private:
   int data;
public:
   void set(int val){
      this->data = val; // всегда неявно передаётся указатель на объект для которого вызван метод
   }
   static void sta_set(C* that, int val){
      that->data = val; // вместо неявного this, передаём указатель that вручную, при каждом вызове.
   }

   friend class D;
};

class D{
public:
   void set_C_data(C* that, int val){
       that->data = val; // friend классы и функции просто имеют доступ к закрытым данным класса C
                                    // и используются в редких и специфических случаях
   }
   static void sta_set_C_data(C* that, int val){
       that->data = val; // friend классы и функции просто имеют доступ к закрытым данным класса C
                                    // и используются в редких и специфических случаях
   }
};


int main(int argv, char* argc[]){
   C objC;
   objC.set(1); // вызова "обычного" метода класса
   C::sta_set(&objC, 1); // вызов статического метода класса
   // в обоих случаях результат один и тот же

   D objD;
   objD.set_C_data(&objC, 1); // this == &objD
   D::sta_set_C_data(&objC, 1);

    return 0;
}



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.