Форум программистов, компьютерный форум CyberForum.ru

Видимость в классах - C++

Восстановить пароль Регистрация
 
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
14.08.2011, 15:26     Видимость в классах #1
Дана программа

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
class a
{protected:
int a1;
public:
    void fc()
    {a1=5;cout<<a1<<endl;
    }
};
class b :public a
{public:
void fc1()
{cout<<a1;}
};
int main ()
{setlocale(LC_ALL,"Rus");
a a1;
b b1;
a1.fc();
b1.fc1();
cin.get();
cin.get();
return 0;
}
Как сделать так чтобы
C++
1
a1
была видна в классе b ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2011, 15:26     Видимость в классах
Посмотрите здесь:

static и глобальная видимость C++
C++ Конструкторы в классах
C++ Видимость класса в других файлах
видимость переменной C++
Видимость классов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
14.08.2011, 15:42     Видимость в классах #2
вообще то она итак должна быть видна...
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
14.08.2011, 15:43     Видимость в классах #3
вместо a1 выводит "дурь" потомучто она не инициализирована
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
using namespace std;
 
class A
{
protected:
    int a;
public:
        void fc()
        {
        a=5;
        cout<<a<<endl;
        }
        
};
class B: public A
{
public:
    void fc_()
    {
        cout<<a;
    }
};
int main ()
{setlocale(LC_ALL,"Rus");
A Ac;
B Bc;
Ac.fc();
Bc.fc();
Bc.fc_();
cin.get();
return 0;
вызвав функцию fc() для переменной класс В и всё будет норм.
Сыроежка
Заблокирован
14.08.2011, 16:20     Видимость в классах #4
Цитата Сообщение от parkito Посмотреть сообщение
Дана программа

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
class a
{protected:
int a1;
public:
    void fc()
    {a1=5;cout<<a1<<endl;
    }
};
class b :public a
{public:
void fc1()
{cout<<a1;}
};
int main ()
{setlocale(LC_ALL,"Rus");
a a1;
b b1;
a1.fc();
b1.fc1();
cin.get();
cin.get();
return 0;
}
Как сделать так чтобы
C++
1
a1
была видна в классе b ?
a1 является видимой в классе B, так как у ней уровень доступа protected, а потому все наследуеимые классы, если они наследуют класс a открыто, имеют к ней доступ, как к любой своей переменной с уровнем доступа private.

Другое дело, что эта переменная ни в классе a, ни в классе b не инициализирована. Поэтому можно ее инициализировать в списке инициализации конструктора класса a. Например

a::a() : a1( int() ) {}
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
14.08.2011, 16:26     Видимость в классах #5
Цитата Сообщение от Сыроежка Посмотреть сообщение
Другое дело, что эта переменная ни в классе a, ни в классе b не инициализирована. Поэтому можно ее инициализировать в списке инициализации конструктора класса a. Например
В классе а она инициализируется в функции fc()
Bers
Заблокирован
14.08.2011, 17:13     Видимость в классах #6
Цитата Сообщение от Ree.exe Посмотреть сообщение
В классе а она инициализируется в функции fc()
Нет. Она там не инициализируется, а просто получает значение.

Инициализация данных-членов происходит в конструкторе класса.
Но поскольку, данный класс пользует дефолтный конструктор, то ничего удивительного, что она инициализируется мусором.

Запрос автора был не о том, как правильно инициализировать данные-члены класса, а по поводу видимости.

Ответ на этот запрос: потомки видят протектед данные-члены своего предка.
Сыроежка
Заблокирован
14.08.2011, 17:18     Видимость в классах #7
Цитата Сообщение от Ree.exe Посмотреть сообщение
В классе а она инициализируется в функции fc()
Эта она будет инициализирована только при условии, что вы вызовите эту функцию перед тем, как будете использовать эту переменную. Если пользователь вашего класса не будет вызывать эту функцию, то переменная так и останется неинициализированной. То есть когда создается объект вашего класса a или производного класса, значение переменной остается неопределнным.
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
14.08.2011, 17:34     Видимость в классах #8

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
Эта она будет инициализирована только при условии, что вы вызовите эту функцию перед тем, как будете использовать эту переменную. Если пользователь вашего класса не будет вызывать эту функцию, то переменная так и останется неинициализированной. То есть когда создается объект вашего класса a или производного класса, значение переменной остается неопределнным.
Ну это я понимаю.В предложенном примере переменные никак не инициализировать по другому(автор не написал конструктор)



Добавлено через 6 минут

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Нет. Она там не инициализируется, а просто получает значение.
Но ведь вроде получение начального значения переменной и есть ее инициализацией или что-то я напутал

?
Сыроежка
Заблокирован
14.08.2011, 17:40     Видимость в классах #9
Цитата Сообщение от Ree.exe Посмотреть сообщение

Не по теме:


Ну это я понимаю.В предложенном примере переменные никак не инициализировать по другому(автор не написал конструктор)



Добавлено через 6 минут

Не по теме:


Но ведь вроде получение начального значения переменной и есть ее инициализацией или что-то я напутал

?
Вообще-то, строго говоря, инициализацией перменной является присвоение ей значения при ее определении. Но часто этот терпин используют в более широком смысле, что переменная так и не получила значения.
Bers
14.08.2011, 18:02
  #10

Не по теме:

Цитата Сообщение от Ree.exe Посмотреть сообщение
Но ведь вроде получение начального значения переменной и есть ее инициализацией или что-то я напутал
Присваивание не есть инициализация!

При создании объекта, компилятор делает две вещи:

1. Выделяет память под объект.
2. Запускает конструктор.

Инициализация - это конструирование объекта при помощи конструктора (явно-указанного, либо дефолтного)

Присваивание - это запуск operator= у уже созданного (инициализированного) объекта.

Инициализация данных членов класса происходит только в списках инициализации конструкторов этого класса, и имеет вид:
ИмяКласса: Данные-член(стартовые параметры) {тело конструктора }

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2011, 10:54     Видимость в классах
Еще ссылки по теме:

Видимость переменной C++
C++ Глобальная видимость переменной в проекте
C++ Видимость переменных

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
15.08.2011, 10:54  [ТС]     Видимость в классах #11
Что-то я с этим запарил, но спасибо разобрался.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
using namespace std;
class a
{protected:
int a1;
public:
    a():a1(0)
    {}
    void fc()
    {a1=5;cout<<a1<<endl;
    }
};
class b :public a
{public:
void fc1()
{cout<<a1;}
};
int main ()
{setlocale(LC_ALL,"Rus");
a a1;
b b1;
b1.fc();
b1.fc1();
cin.get();
cin.get();
return 0;
}
Yandex
Объявления
15.08.2011, 10:54     Видимость в классах
Ответ Создать тему
Опции темы

Текущее время: 08:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru