Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/47: Рейтинг темы: голосов - 47, средняя оценка - 4.98
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
1

Невозможно обратиться к protected член, объявленному в классе "Counter"

23.07.2014, 16:07. Показов 8794. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
typedef unsigned int uint;                                                                            
class Counter
{
protected:
    uint count;
    Counter() : count(0)
    { }
    Counter(int c) : count(c)
    { }
public:
    uint get_count () const
    { return count; }
    Counter operator++()
    { return Counter(++count); }
};
 
class CountDn : public Counter
{
public:
    Counter operator--()
    { return Counter(--count); } //error C2248: Counter::Counter: невозможно обратиться к protected член, объявленному в классе "Counter"
};
 
void main()
{
    CountDn c1;
    cout<<"c1= "<<c1.get_count();
    ++c1; ++c1; ++c1;
    cout<<"\nc1= "<<c1.get_count();
    --c1; --c1;
    cout<<"\nc1= "<<c1.get_count()<<endl;
    system("pause");
}
Скажите почему, ведь у меня перед конструкторами стоит ключевое слово protected.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2014, 16:07
Ответы с готовыми решениями:

Невозможно обратиться к private член, объявленному в классе
View.h #pragma once #include &quot;Model.h&quot; class View { private: ModelClass model; public:...

Невозможно обратиться к private член, объявленному в классе "Complex"
выдавало ошибку &quot;невозможно обратиться к private член, объявленному в классе &quot;Complex&quot;&quot; я поменяла...

QWidget::operator =: невозможно обратиться к private член
Я попытался в class Nightcharts добавить базовый public QWidget но выходит ошибка( error...

Обратиться к форме из наследника, объявив ui protected
День добрый. Такой проблема встала: я пишу весь ГУЙ ручками, т.е. без использования дизайнера....

О недоступности protected членов в производном классе
Здравствуйте. Столкнулся с неожиданной проблемой: В методах производного класса недоступны...

31
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.07.2014, 16:20 2
У вас конструктор закрытый и поэтому не возможно создать объект.
Перепишите класс следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Counter
{
protected:
    uint count;
public:
    Counter() : count(0)
    { }
    Counter(int c) : count(c)
    { }
    uint get_count () const
    { return count; }
    Counter operator++()
    { return Counter(++count); }
};
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
23.07.2014, 16:26 3
clang выдает такое пояснение:
note: protected constructor can only be used to construct a base class subobject
, ребят, если кто знает где сие описано в стандарте просьба выдрать цитату / написать номер параграфа.

ТС, вам это по сути не нужно. Можно сделать так:

C++
1
2
    CountDn operator--()
    { --count; return *this; }
Добавлено через 48 секунд
Ilot, Чего это он закрытый? Он защищенный. И зовется из функции потомка.
1
34 / 34 / 8
Регистрация: 13.06.2014
Сообщений: 509
23.07.2014, 16:26 4
stzer, скажи, а зачем ты используешь protected?
0
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
23.07.2014, 16:33  [ТС] 5
frostyfull, для изучения тонкостей языка.

Добавлено через 1 минуту
ForEveR, просто непонятно, почему потомок не видит конструктора базового класса.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.07.2014, 16:39 6
Цитата Сообщение от ForEveR Посмотреть сообщение
Чего это он закрытый? Он защищенный. И зовется из функции потомка.
Ну это и имелось ввиду.
Цитата Сообщение от stzer Посмотреть сообщение
ForEveR, просто непонятно, почему потомок не видит конструктора базового класса.
Он его видит однако для того что бы создать объект его конструктор должен быть открытым. В противном случае конструирование возможно только посредством статической функции, как, например, это применяется в паттерне синглон. А вот вам и пример:
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
#include <iostream>
using namespace std;
typedef unsigned int uint;
class Counter
{
protected:
    uint count;
    Counter() : count(0)
    { }
    Counter(int c) : count(c)
    { }
public:
    uint get_count () const
    { return count; }
    Counter operator++()
    { return Counter(++count); }
    static Counter init(int i = 0) {
       return Counter(i);
    }
};
 
class CountDn : public Counter
{
public:
    Counter operator--()
    { return init(--count); }
};
 
int main()
{
    CountDn c1;
    cout<<"c1= "<<c1.get_count();
    ++c1; ++c1; ++c1;
    cout<<"\nc1= "<<c1.get_count();
    --c1; --c1;
    cout<<"\nc1= "<<c1.get_count()<<endl;
    system("pause");
    return 0;
}
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
23.07.2014, 16:42 7
Цитата Сообщение от Ilot Посмотреть сообщение
Он его видит однако для того что бы создать объект его конструктор должен быть открытым. В противном случае конструирование возможно только посредством статической функции, как например это применяется в паттерне синглон.
Я мб спрошу какую-то глупую вещь, но можно выдержку из стандарта по этому поводу? Ссылка на stackoverflow или еще куда тоже сойдет.
0
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
23.07.2014, 16:47  [ТС] 8
Ilot, а вроде статическая функция работает только с статическими элементами? Нет?
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
23.07.2014, 16:52 9
ForEveR, 11.4 Protected member access оно?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
23.07.2014, 17:00 10
HighPredator, Я не вижу там ровным счетом ничего про данный случай, почему это я не могу создать объект базового класса просто так, а не как часть данного (в конструкторе)?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.07.2014, 17:01 11
Цитата Сообщение от ForEveR Посмотреть сообщение
Я мб спрошу какую-то глупую вещь, но можно выдержку из стандарта по этому поводу? Ссылка на stackoverflow или еще куда тоже сойдет.
Я скорее всего совру, но как я понимаю конструктор это особливая функция которая вызывается компилятором(?) и она поэтому обязана быть открытой. К примеру есть попытаться проделать похожий фокус с protected функцией не конструктором то все будет ок:
Кликните здесь для просмотра всего текста
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>
using namespace std;
typedef unsigned int uint;
class Counter
{
protected:
    uint count;
    Counter() : count(0)
    { }
    Counter(int c) : count(c)
    { }
    Counter func() {
        return Counter();
    }
public:
    uint get_count () const
    { return count; }
    Counter operator++()
    { return Counter(++count); }
 
};
 
class CountDn : public Counter
{
public:
    Counter operator--()
    { return func(); }
};
 
int main()
{
    CountDn c1;
    cout<<"c1= "<<c1.get_count();
    ++c1; ++c1; ++c1;
    cout<<"\nc1= "<<c1.get_count();
    --c1; --c1;
    cout<<"\nc1= "<<c1.get_count()<<endl;
    system("pause");
    return 0;
}

Хотя, если быть откровенным, я уже сам запутался
0
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
23.07.2014, 17:05  [ТС] 12
Ilot, Почему там static? Он там не нужен.
И вообще я читал везде, что статический метод используется для обращения только к стат-ким полям класса.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.07.2014, 17:08 13
Цитата Сообщение от stzer Посмотреть сообщение
Ilot, Почему там static? Он там не нужен.
Не нужен. Исправил.
Цитата Сообщение от stzer Посмотреть сообщение
И вообще я читал везде, что статический метод используется для обращения только к стат-ким полям класса.
А где в коде идет обращение к нестатическим полям?
0
34 / 34 / 8
Регистрация: 13.06.2014
Сообщений: 509
23.07.2014, 17:13 14
Ilot, о я наконец допер что есть конструктор и что есть диструктор, именно в плане понимания
собственно и 5 лет не прошло с момента изучения классов
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
23.07.2014, 18:17 15
ForEveR, а, значит я не так понял что тебе нужно, сорри.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
23.07.2014, 18:38 16
Цитата Сообщение от stzer Посмотреть сообщение
И вообще я читал везде, что статический метод используется для обращения только к стат-ким полям класса.
Он может обращаться к любым членам
просто в него не передается неявный параметр this, в отличии от нестатических методов
следовательно его нужно явно передать
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
public:
int i;
staic void StatFunc(int b, A* a){a->i=b;); 
 
 
} 
int main()
{
A a;
A::StatFunc(10,&a);
 
}
1
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
23.07.2014, 19:00  [ТС] 17
ValeryS, Спасибо, интересно
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
23.07.2014, 19:23 18
Цитата Сообщение от ForEveR Посмотреть сообщение
почему это я не могу создать объект базового класса просто так, а не как часть данного (в конструкторе)?
Да можешь запросто, например из friend функции. Из нее можно и с private.

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
public:
    friend A create();
 
protected:
    A(int a) : a(a) { }
private:
    int a;
};
 
A create()
{
    return A(10);
}
 
int main()
{
    A a = create();
}
Это абсолютно легально.
Полезно при проектировании фабричных классов. Создаваемые классы защищены от создания вне фабрики (protected конструктор), но в то же время их можно расширять путем наследования.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.07.2014, 19:54 19
Цитата Сообщение от DrOffset Посмотреть сообщение
Да можешь запросто, например из friend функции. Из нее можно и с private.
Вопрос остался: почему в методе производного класса нельзя вызвать защищённый конструктор базового?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
23.07.2014, 20:35 20
Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

Цитата Сообщение от alsav22 Посмотреть сообщение
Вопрос остался: почему в методе производного класса нельзя вызвать защищённый конструктор базового?
А вот в чем вопрос-то. Я сразу не понял
В общем, protected просто так работает. Он предоставляет доступ к "закрытым" полям базового класса только для объекта наследника. Вот небольшой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
protected:
    int a;
};
 
class B : public A
{
public:
    B()
    {
         a = 1; // ок. мы в том же самом объекте
         A * p = this;
         p->a = 0; //ошибка
    }
};
Конструирование класса А тоже к этому относится. Т.к. конструктор вызывается уж не у текущего объекта.
Ссылку на стандарт попробую попозже найти.

Добавлено через 9 минут
Собственно вот (о чем я и говорил см. Clause 11):
12/4
Special member functions obey the usual access rules (Clause 11). [ Example: declaring a constructor
protected ensures that only derived classes and friends can create objects using it
. —end example ]
Как раз привели в пример конкретную ситуацию с конструктором.
5
23.07.2014, 20:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2014, 20:35
Помогаю со студенческими работами здесь

Почему дружественная функция не может обратиться к protected полю класса?
Не могу понять, почему функция не может обратиться к protected полю класса: class Ships {...

Не могу в дочернем классе вызвать protected метод
Всем привет! Начал писать одну программку, и столкнулся со следующей проблемой: у меня пока 2...

Невозможно соединиться с сервером в Counter-Strike 1.6
Всем привет, Ребята подскажите кто что знает, пропало меню игры с лева,конект на сервак делаю любой...

ПО CORAL-ERM: COUNTER R5 либо конвертация COUNTER R5 в COUNTER R4
Уважаемые программисты, здравствуйте! Есть прикладная система CORAL ERM версии 3.0.1, которая...

Не могу в методе дочернего класса обратиться к protected члену родительского класса
Родительский класс с виртуальным методом. class Human { protected: std::string m_name; int...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru