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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2010, 20:39   #1
Lord-of-Hedgehogs
Пользователь
 
Аватар для Lord-of-Hedgehogs
 
Регистрация: 27.10.2009
Сообщений: 11
По умолчанию Область видимости членов класса.

Написал следующий несложный код:
Код:
#include<iostream>
using namespace std;

class d{
public:
void f() {cout << b << endl;}
};

class a{
d o;
public:
int b;
a() {b = 123;}
void m() {o.f();}
};

int main()
{
a asd;
asd.m();
}
Объект о класса d - член класса a. Переменная b тоже член класса а. Почему метод f объекта o не видит переменную b? (при компиляции выскакивает ошибка b was not declared in this scope)
Lord-of-Hedgehogs вне форума Ответить с цитированием
Старый 27.11.2010, 20:55   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ээээ....А если так?
Код:
#include<iostream>
using namespace std;

class d
{
public:
void f() {cout << b << endl;}
};

class a
{
public:
d o;
int b;
a() {b = 123;}
void m() {o.f();}
};

int main()
{
a asd;
asd.m();
}
_-Re@l-_ вне форума Ответить с цитированием
Старый 27.11.2010, 20:57   #3
Lord-of-Hedgehogs
Пользователь
 
Аватар для Lord-of-Hedgehogs
 
Регистрация: 27.10.2009
Сообщений: 11
По умолчанию

Неа, все равно не видит.
Lord-of-Hedgehogs вне форума Ответить с цитированием
Старый 27.11.2010, 20:58   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Внутри класса при обращениям к полям данного объекта неявно подставляется указатель this; вот у вас и получается, что "существует" общедоступный объект d::b, которого на самом деле то и нет.
С другой стороны подумайте, что делать компилятору в такой ситуации:
Код:
// ...
int main()
{
      d o;
      o.f(); // ??? (b нету в main)
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 27.11.2010, 21:04   #5
Lord-of-Hedgehogs
Пользователь
 
Аватар для Lord-of-Hedgehogs
 
Регистрация: 27.10.2009
Сообщений: 11
По умолчанию

Syuf, понятно. А можно как-нибудь из этой ситуации вывернуться, чтобы все-таки получить доступ к b?
Lord-of-Hedgehogs вне форума Ответить с цитированием
Старый 27.11.2010, 21:10   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

М-да. Разве что так:
Код:
#include<iostream>
using namespace std;

class a;

class d
{
public:
void f(const a *pa) { cout << pa->b << endl; }
};

class a
{
public:
d o;
int b;
a() {b = 123;}
void m() {o.f(this);}
};
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 27.11.2010, 21:15   #7
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Можно обойтись и без предобъявления и выводить член b любого класса. Не пойму, правда зачем

Код:
#include<iostream>
using namespace std;

class d
{
public:
    template<class T>
    void f(const T *t) {cout << t->b << endl;}
};

class a
{
public:
    d o;
    int b;
    a() {b = 123;}
    void m() {o.f(this);}
};

int main()
{
    a asd;
    asd.m();
}
sergey.d вне форума Ответить с цитированием
Старый 27.11.2010, 21:15   #8
Lord-of-Hedgehogs
Пользователь
 
Аватар для Lord-of-Hedgehogs
 
Регистрация: 27.10.2009
Сообщений: 11
По умолчанию

Большое спасибо.
Цитата:
Не пойму, правда зачем
Этот пример просто является принципиальной схемой куда более сложного кода. И похожее обращение к члену класса из метода другого члена класса является одним из возможных решений задачи.

Последний раз редактировалось Lord-of-Hedgehogs; 27.11.2010 в 21:19.
Lord-of-Hedgehogs вне форума Ответить с цитированием
Старый 27.11.2010, 21:26   #9
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Цитата:
Большое спасибо.
Тогда не забываем клацнуть по весам
sergey.d вне форума Ответить с цитированием
Старый 27.11.2010, 21:29   #10
Lord-of-Hedgehogs
Пользователь
 
Аватар для Lord-of-Hedgehogs
 
Регистрация: 27.10.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от sergey.d Посмотреть сообщение
Тогда не забываем клацнуть по весам
Клацнул, клацнул.
Lord-of-Hedgehogs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Область видимости переменной bondik Общие вопросы .NET 4 04.10.2010 12:18
Публичная область видимости Бутаков_Сергей Общие вопросы Delphi 1 20.04.2010 09:02
область видимости Dimarik Общие вопросы .NET 5 21.02.2010 21:32
область видимости процедур Uli9 Общие вопросы Delphi 16 06.12.2008 21:09
область видимости ? artem779 Общие вопросы Delphi 3 14.09.2007 09:34