Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать дружественное поле (переменную)?  (Прочитано 9197 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« : 28-11-2012 16:41 » 

Мне надо переменную из класса в класс передать. Классы между собой не связаны. Мне сказали что можно передать переменную из класс в класс через дружественное поле (переменную), но в интернете, кроме дружественных классов и функций ничего не нашёл. Помогите пожалуйста это сделать.
Привожу для этой цели простенький пример:

Главный файл mymain.cpp:

Код:
#include "a.h"
#include "b.h"
#include "conio.h"

int main()
{
a a1(0);
a1.funx();
b b1(0);
b1.funu();
_getch();

return 0;
}

Создание класса "а":

Код:
#ifndef a_h
#define a_h

class a
{
public:
int x;
a(int y);
void funx();
};

#endif

Код:
#include "a.h"
#include <iostream>
using namespace std;

a::a(int y)
{
x = y;
}
void a::funx()
{
x = 3;
cout << x << endl;
}

Создание класса "b":

Код:
#ifndef b_h
#define b_h

class b
{
public:
int u;
b(int v);
void funu();
};

#endif

Код:
#include "b.h"
#include <iostream>
using namespace std;

b::b(int v)
{
u = v;
}
void b::funu()
{
u = x;
cout << u << endl;
}

Мне надо что бы в классе "b" видна была переменная "x". В настоящий момент она не видна.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 28-11-2012 18:40 » 

Добавь в класс a аксессор (метод) вроде getx, и добавь в класс b указатель (или ссылку) на a. Зачем городить всяких "друзей"? Если же x открыта, то и аксессора не надо. Короче говоря, свяжи классы, раз они не связаны.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 29-11-2012 21:10 » 

Нифига не понял, что значит "передать переменную из класса в класс"? В main ничего такого не происходит.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #3 : 01-12-2012 11:10 » 

Джон, в описании класса "b" используется переменная "x" из класса "a", но она в классе "b" не видна.
Я попробовал в файл b.cpp:
1. Добавить
Код:
#include "a.h"

и в место

Код:
u = x;

Написать

Код:
u = a::x; 

Результат:
Ошибка что "x" не известна пропала, но такое присваивание нельзя сделать. В добавок  среда Visual Stidio 2008 не видит "x".

2. Добавить в заголовочный файл класса "b" строку
Код:
 using a::x;
то ошибки что "x" не известна нету, но
Код:
u = a::x;
нельзя сделать, но среда Visual Stidio 2008 уже видит "x".
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 01-12-2012 12:07 » 

zuze, ну это тебе надо с азов начинать: чем класс от объекта отличается. Разумеется, объектное поле из класса недоступно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #5 : 02-12-2012 04:22 » 

Проблема решена. Если кому интересно будет, то вот передача поля из класса в класс, которые не связанные друг с другом с помощью дружественной функции.

Главный файл mymain.cpp:

Код:
#include "a.h"
#include "b.h"
#include "conio.h"

int main()
{
a a1(0);
a1.funx();
b b1(0);
b1.funu(&a1);
_getch();

return 0;
}

Создание класса "а":

Код:
#ifndef a_h
#define a_h

class a
{
public:
int x;
a(int y);
void funx();
friend int getx (a *p);
};

#endif

Код:
#include "a.h"
#include <iostream>
using namespace std;

a::a(int y)
{
x = y;
}
void a::funx()
{
x = 3;
cout << x << endl;
}
int getx( a *p)
{
return p->x;
}

Создание класса "b":

Код:
#ifndef b_h
#define b_h

#include "a.h"

class b
{
public:
int u;
b(int v);
void funu(a *p);
};

#endif

Код:
#include "b.h"
#include "a.h"
#include <iostream>
using namespace std;

b::b(int v)
{
u = v;
}
void b::funu(a *p)
{
u = getx(p);
cout << u << endl;
}
« Последнее редактирование: 02-12-2012 04:25 от zuze » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 02-12-2012 12:32 » 

zuze, адское нагромождение непонятно чего. А всё, чего ты достиг в результате, записывается в разы короче

Код: (C++)
#include <iostream>

using namespace std;

class С {
public:
  int x;
  С(int x) :
    x(x)
  {}
};

int main() {
  С a(0), b(1);
  cout << a.x << "\t" << b.x << endl;
  return 0;
}
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #7 : 02-12-2012 13:10 » 

Dimka,  Ваш код работает так как у Вас два экземпляра одного класса. А у меня совершенно независимые классы.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 02-12-2012 14:50 » new

zuze, а какая разница, если вопрос о доступе?

Код: (C++)
class A {
public:
  int x;
};

class B {
public:
  void f(A &a) {
    cout << a.x << endl;
  }
};
То же самое можно и одним классом сделать: доступ к другому экземпляру.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 03-12-2012 08:44 » 

Джон, в описании класса "b" используется переменная "x" из класса "a", но она в классе "b" не видна.
...

Ошибка что "x" не известна пропала, но такое присваивание нельзя сделать. В добавок  среда Visual Stidio 2008 не видит "x".

Блин, как всё запущено! Начинать надо действительно с азов. Нельзя учиться программировать методом тыка, авось заработает. Что есть класс? Что есть переменная? Что есть значение? Что есть scope resolution operator? Что есть среда Visual Stidio 2008? Именно в этом проблема, точнее в нечётком представлении и/или понимании (к сожалению, из этих коротких сообщений и обрывков кода трудно сделать более точный вывод) этих понятий.

Сначала надо с этим разобраться, и сформулировать задачу ПРАВИЛЬНО. Правильно сформулированная задча содержит в себе 50% решения. Хотя в данном случае, я думаю, что вопрос отпадёт сам собой. К примеру, вот этот код:

Код: (C++)
u = a::x;

конечно будет работать, если добавить в объявление переменной x всего одно слово. Но действительно ли это то, что нужно? Что вобще означет запись
Код: (C++)
a::x
?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines