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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
#1

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

14.08.2011, 15:26. Просмотров 641. Ответов 10
Метки нет (Все метки)

Дана программа

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     Видимость в классах
Посмотрите здесь:

Видимость переменных - C++
Ребят такой вопрос, Есть у меня класс А и наследуемый от него класс B, в классе B есть паблик переменная C Можно ли вызвать эту переменну...

Видимость переменной - C++
Доброго времени суток. Нужна небольшая консультация по программе. У меня программа состоит из нескольких методов в каждом из которых...

Видимость классов - C++
Как сделать что бы один класс мог работать с классом который объявлен после него но использует его. class Cmd1 { Cmd1* var1; ...

Видимость переменной - C++
Подскажите пожалуйста, если у меня есть две функции, в которых мне надо использовать одну и ту же константу, правильнее будет сделать её...

static и глобальная видимость - C++
прочитал что если писать static int a = 5; то a будет видно ото всюду но оказалосбь это не так... void a(); int main() { ...

Ссылки в классах - C++
Почему в этой программе нужно использовать ссылки? Как сделать эту программу не используя ссылки? #include &lt;iostream.h&gt; class sum{ ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++
Пишет ошибку error C2259: Matrix: невозможно создать экземпляр абстрактного класса Что это значит? выкладываю код в котором...

Исключения в классах - C++
Здравствуйте. Какими средствами правильней всего сделать обработку исключений в классах? /* например, эта функция */ int...


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

Или воспользуйтесь поиском по форуму:
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
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     Видимость в классах
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru