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

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

Войти
Регистрация
Восстановить пароль
 
 
daslex
1290 / 534 / 110
Регистрация: 02.08.2011
Сообщений: 2,756
#1

Protected в классах - C++

03.06.2015, 09:57. Просмотров 879. Ответов 32
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
class TPoint{
    protected:
        int x,y;
        TPoint *t;
    public:
 
};
 
class TCircle:public TPoint{
    protected:
        int radius;
    public:
        TCircle(TPoint T, int Radius){t->x=200;};
        void GetData();
};
 
//////////////////////////
int main(){}
Думал, что если происходит наследование, то то, что в родительском классе объявлено внутри protected будет доступно наследнику.
Но получил ошибку error: 'int TPoint::x' is protected|

Чего-то я не допонял. Нужно разъяснение и пример как такое делают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2015, 09:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Protected в классах (C++):

protected или не protected : ) - C++
собстно не могу решить как поступить. есть абстрактный класс окошка, являющийся базовым для всех окошек. есть 3 варианта...

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

PROTECTED - C++
есть два класса: class Base{ private: int age; }; class Derived: public Base{ .......

Protected Struct - C++
Привет народ. Сижу тут с классами корочь, и вдруг вылезла ошибка (типа нет доступа), но никак не могу понять почему: ошибка в 33-й строке,...

Protected DVD - C++
Доброго дня! Не нашел нужного раздела для подобной темы... Суть в чем - как можно определить, является ли DVD диск защищенным от...

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

32
rikimaru2013
C++ Game Dev
2471 / 1140 / 241
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 10:06 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
 
using namespace std;
 
class TPoint
{
protected:
    int x, y;
    TPoint *t;
public:
 
};
 
class TCircle :public TPoint
{
protected:
    int radius;
public:
    TCircle(TPoint T, int Radius)
    {
        x = 200;
    };
    void GetData();
};
 
//////////////////////////
int main()
{
}

он ругается, потому что в том указатели может быть любой экземпляр TPoint - а у вас доступ к полю только одного, который находится в вас.
1
rikimaru2013
C++ Game Dev
2471 / 1140 / 241
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 10:30 #3
я же объяснил почему не работает protected ) используйте геттер
0
daslex
1290 / 534 / 110
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 10:31  [ТС] #4
Все норм. Можно и без геттера. Пример приведенный просто не то, а разъяснение самое оно
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 241
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 10:50 #5
мне аж интесно стало ) как достучаться до protected поля чужого объекта, но такого же типа) Расскажите буду знать
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:00 #6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
мне аж интесно стало ) как достучаться до protected поля чужого объекта, но такого же типа) Расскажите буду знать
Ты об этом?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class A {
protected:
    int i;
 
public:
    A( int i ) : i(i) {}
 
    void foo( const A & a ) {
        std::cout << a.i << std::endl;
    }
};
 
int main()
{
    A a( 123 );
    A b( 456 );
    b.foo( a );
    a.foo( b );
    return 0;
}
1
rikimaru2013
C++ Game Dev
2471 / 1140 / 241
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 11:08 #7
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
33
34
35
36
37
38
39
40
#include <iostream>
 
class A
{
protected:
    int i;
 
public:
    A(int i) : i(i)
    {
    }
 
    void A::foo(const A & a);
};
 
class AA    : public A
{
protected:
    int i;
public:
    AA(int i) :
        A(11),
        i(i)
    {
 
    }
 
};
void A::foo(const A & a)
{
    std::cout << a.i << std::endl;
}
int main()
{
    AA a(123);
    A b(456);
    b.foo(a);
    
    return 0;
}
незнал такую магию - не использую стековые объекты. Как-то к указателям привык, и они по всему проекту прыгают, а ссылки такие не поворотные как по мне ( . Но спасибо - буду знать
1
daslex
1290 / 534 / 110
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 11:24  [ТС] #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
мне аж интесно стало ) как достучаться до protected поля чужого объекта,
зачем чужого, можно же и до своего. В чужой лазить это противоречит самой идее использования сокрытия данных.
___________________________



У меня получается ответвление от названия темы, но продолжение вопроса по наследованию
________________
Чтобы с объектом можно было работать в таком виде

C++
1
obj(TPoint,int)  //X,Y и радиус
Попробовал использовать наследование
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
#include <iostream>
 
using namespace std;
 
class TPoint
{
protected:
    int x, y;
public:
    TPoint(int,int);
};
 
class TCircle :public TPoint
{
protected:
    int radius;
public:
    TCircle(TPoint, int);
    void Show();
    ~TCircle(){};
};
 
TPoint::TPoint(int X,int Y){}
//////////////////////////////
 
TCircle::TCircle( (TPoint T=TPoint(10,10) ),int radius){   
 
}
 
//////////////////////////
int main(){}
Получил ошибку

Смысл того чего я хотел здесь - это аналогично функциям использовать аргумент по умолчанию и задействовать конструктор с параметрами. Хотя это просто моя попытка. Смысл того чего я хочу добиться в том, чтобы можно было использовать объект в формате
obj(TPoint,int) в то время когда у TPoint заданы координаты.
С использованием конструктора по умолчанию у меня получилось, при задании своих данных в свой конструктор у меня не вышло.
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:29 #9
Цитата Сообщение от daslex Посмотреть сообщение
Смысл того чего я хотел здесь - это аналогично функциям использовать аргумент по умолчанию и задействовать конструктор с параметрами.
Параметры по умолчанию должны указываться с конца.

Не совсем понял. Нужно чтобы объект класса TCircle можно было создать так: TCircle с( 100, 200, 50 ); ?
1
daslex
1290 / 534 / 110
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 11:33  [ТС] #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
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
using namespace std;
 
class TPoint
{
protected:
    int x, y;
public:
    TPoint(int,int);
};
 
class TCircle :public TPoint
{
protected:
    int radius;
public:
    TCircle(TPoint, int);
    void Show();
    ~TCircle(){};
};
 
TPoint::TPoint(int X,int Y){}
//////////////////////////////
 
TCircle::TCircle(TPoint T(10,10),int radius){
 
}
 
//////////////////////////
int main()
{
 
   TPoint T(100,300);  //X=100,Y=300
   TCircle circle(T,789); //Х=100, Y=300, R=789
}
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:37 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Зачем в 26-й строке (10,10)?
Для класса TPoint нет конструктора без параметров.
C++
1
TCircle::TCircle( TPoint T, int radius ) : TPoint( T ), radius( radius ) {}
1
daslex
1290 / 534 / 110
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 11:44  [ТС] #12
Если я использую конструктор без параметров, он перебивает конструктор с параметрами и в итоге в объект записыватся не то, что я указываю, а то, что указываю в конструкторе без параметров.
Должно получится 10,100,78

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
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
using namespace std;
 
class TPoint
{
protected:
    int x, y;
public:
    TPoint(int X,int Y):x(X),y(Y){};
    TPoint():x(50),y(150){};
};
 
class TCircle :public TPoint
{
protected:
    int radius;
public:
    TCircle(TPoint, int);
    void Show();
    ~TCircle(){};
};
 
TCircle::TCircle(TPoint T, int Radius){
    x=this->x;
    y=this->y;
    radius=Radius;
}
 
void TCircle::Show(){
        cout<<this->x<<"  "<<this->y<<"  "<<this->radius;
}
 
//////////////////////////
int main()
{
    TPoint X(10,100);  //10.100
 
 
    TCircle circle(X,78);
 
    circle.Show();
 
 
}
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 241
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 11:47 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
 
using namespace std;
 
class TPoint
{
protected:
    int x, y;
public:
    TPoint(int X, int Y) :x(X), y(Y)
    {
    };
    TPoint(const TPoint& copy)
    {
        cout << "Copy Constr" << endl;
        x = copy.x;
        y = copy.y;
    }
    TPoint() :x(50), y(150)
    {
    };
};
 
class TCircle :public TPoint
{
protected:
    int radius;
public:
    TCircle(TPoint, int);
    void Show();
    ~TCircle()
    {
    };
};
 
TCircle::TCircle(TPoint T, int Radius) : 
TPoint(T)
{
    x = this->x;
    y = this->y;
    radius = Radius;
}
 
void TCircle::Show()
{
    cout << this->x << "  " << this->y << "  " << this->radius;
}
 
//////////////////////////
int main()
{
    TPoint X(10, 100);  //10.100
 
 
    TCircle circle(X, 78);
 
    circle.Show();
 
 
}
А вот если бы вы прочитали пост выше - вы бы услышали (
1
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:48 #14
Конструктор без параметров не нужен с вариантом из 12-го поста.
1
rikimaru2013
03.06.2015, 11:52     Protected в классах
  #15

Не по теме:

написал тоже самое, что и castaway, но с его кодом - лайкнул, а его пост нет.

0
03.06.2015, 11:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2015, 11:52
Привет! Вот еще темы с ответами:

Обращение к члену protected - C++
Добрый день, помогите разобраться Обращение к члену protected, сообщается ошибкой Код класса: #include &lt;iostream&gt; #include &lt;string&gt;...

protected и его назначение - C++
Не понятно назначение ключевого слова протектед, хотя пишут что он нужен для класса-потомка, только зачем? Вот код, растолкуйте на нём ,что...

Ключ доступа protected - C++
В каких случаях рекомендовано использовать этот ключ доступа? Если можно, то приведите примеры.:help:

Область видимости Protected - C++
Еcть некий класс player и есть в нем переменная id в области паблик. Есть второй класс team который использует эту переменную. Пjка эти...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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