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

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

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

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

14.08.2011, 15:26. Просмотров 645. Ответов 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 ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2011, 15:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Видимость в классах (C++):

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе - C++
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих имен встречаются во всех классах, какие...

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

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

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

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

Видимость класса в функции - C++
Добрый день. Подскажите, пожалуйста, как сделать, чтобы объявленный класс в функции ini_Class() был виден в теле функции main() ? ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
14.08.2011, 15:42 #2
вообще то она итак должна быть видна...
0
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() для переменной класс В и всё будет норм.
0
Сыроежка
Заблокирован
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() ) {}
0
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
14.08.2011, 16:26 #5
Цитата Сообщение от Сыроежка Посмотреть сообщение
Другое дело, что эта переменная ни в классе a, ни в классе b не инициализирована. Поэтому можно ее инициализировать в списке инициализации конструктора класса a. Например
В классе а она инициализируется в функции fc()
0
Bers
Заблокирован
14.08.2011, 17:13 #6
Цитата Сообщение от Ree.exe Посмотреть сообщение
В классе а она инициализируется в функции fc()
Нет. Она там не инициализируется, а просто получает значение.

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

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

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

Не по теме:

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



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

Не по теме:

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

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

Не по теме:


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



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

Не по теме:


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

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

Не по теме:

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

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

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

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

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

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

0
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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2011, 10:54
Привет! Вот еще темы с ответами:

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

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

Ошибка в классах - C++
Добрый день! Мне необходимо разбить 1 класс на 2: базовый и производный! Я вроде сделал, но вылезает ошибка, что нехватает фигурной...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.08.2011, 10:54
Ответ Создать тему
Опции темы

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