Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
#1

Protected в классах

03.06.2015, 09:57. Просмотров 909. Ответов 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 или не protected : )
собстно не могу решить как поступить. есть абстрактный класс окошка,...

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

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

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

Protected Struct
Привет народ. Сижу тут с классами корочь, и вдруг вылезла ошибка (типа нет...

32
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 10:06 #2
Лучший ответ Сообщение было отмечено daslex как решение

Решение

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
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 10:30 #3
я же объяснил почему не работает protected ) используйте геттер
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 10:31  [ТС] #4
Все норм. Можно и без геттера. Пример приведенный просто не то, а разъяснение самое оно
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 10:50 #5
мне аж интесно стало ) как достучаться до protected поля чужого объекта, но такого же типа) Расскажите буду знать
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 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
2472 / 1141 / 348
Регистрация: 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
1291 / 535 / 177
Регистрация: 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
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:29 #9
Цитата Сообщение от daslex Посмотреть сообщение
Смысл того чего я хотел здесь - это аналогично функциям использовать аргумент по умолчанию и задействовать конструктор с параметрами.
Параметры по умолчанию должны указываться с конца.

Не совсем понял. Нужно чтобы объект класса TCircle можно было создать так: TCircle с( 100, 200, 50 ); ?
1
daslex
1291 / 535 / 177
Регистрация: 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
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:37 #11
Лучший ответ Сообщение было отмечено daslex как решение

Решение

Зачем в 26-й строке (10,10)?
Для класса TPoint нет конструктора без параметров.
C++
1
TCircle::TCircle( TPoint T, int radius ) : TPoint( T ), radius( radius ) {}
1
daslex
1291 / 535 / 177
Регистрация: 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
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 11:47 #13
Лучший ответ Сообщение было отмечено daslex как решение

Решение

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
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:48 #14
Конструктор без параметров не нужен с вариантом из 12-го поста.
1
rikimaru2013
03.06.2015, 11:52
  #15

Не по теме:

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

0
castaway
03.06.2015, 11:52
  #16

Не по теме:

rikimaru2013, 39-я и 40-я строки явно лишние:)

0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.06.2015, 11:53 #17
Цитата Сообщение от daslex Посмотреть сообщение
Вот нерабочий пример
Во-первых, неконстантные данные должны быть private (или public в случае структуры), но ни в коем случае не protected. Иначе в производных классах с данными можно будет наворотить такого, что базовому классу станет не по себе.
Во-вторых, круг, строго говоря, не является точкой. Поэтому публичное наследование тут тоже не уместно.
Ну и в-третьих, избавься от префикса T для типов (из былдера подсмотрел что ли?) - это моветон.
Моя реализация твоей идеи:
Кликните здесь для просмотра всего текста
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 Point
{
private:
    int x_;
    int y_;
public:
    Point(int x, int y): x_(x), y_(y) {}
    int getX() const { return x_; }
    int getY() const { return y_; }
};
 
class Circle: private Point
{
private:
    int r_;
public:
    Circle(int r, const Point& p = Point(10,10) ) : Point(p.getX(), p.getY()), r_(r) {}
};
 
int main()
{
   Point pt(100,300);  //X=100,Y=300
   Circle c1(789, pt); //Х=100, Y=300, R=789
   Circle c2(987); //Х=10, Y=10, R=987
}
1
rikimaru2013
03.06.2015, 11:54
  #18

Не по теме:

castaway, то строки ТСа ))) ему нравится, когда переменные занимаются самоутверждением

0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 12:03  [ТС] #19
Т - это префикс обозначающий тип
https://ru.wikipedia.org/wiki/%C2%E5...F2%E0%F6%E8%FF
________________
Круг не является точкой, но у круга есть его сердце - это центр окружности. Центр окружности - это точка. Не вижу причин недовольства. Относительно сказанного сейчас.
1
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 12:04 #20
Цитата Сообщение от daslex Посмотреть сообщение
Т - это префикс обозначающий тип
Это к чему сказано?
0
03.06.2015, 12:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2015, 12:04

Доступ к protected свойствам
давайте рассмотрим доступ к protected свойствам и методам класса известно...

Область видимости Protected
Еcть некий класс player и есть в нем переменная id в области паблик. Есть...

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


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

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

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