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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
stzer
38 / 59 / 17
Регистрация: 26.10.2013
Сообщений: 172
Завершенные тесты: 2
23.07.2014, 16:07     Невозможно обратиться к protected член, объявленному в классе "Counter" #1
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.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2014, 16:07     Невозможно обратиться к protected член, объявленному в классе "Counter"
Посмотрите здесь:

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
C++ базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит!
невозможно преобразовать параметр 1 из "const char [8]" в "LPCWSTR" C++
C++ Невозможно обратиться к private член, объявленному в классе "Complex"
error C2664: CWnd::MessageBoxW: невозможно преобразовать параметр 2 из "long" в "LPCTSTR" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
23.07.2014, 16:20     Невозможно обратиться к protected член, объявленному в классе "Counter" #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); }
};
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.07.2014, 16:26     Невозможно обратиться к protected член, объявленному в классе "Counter" #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, Чего это он закрытый? Он защищенный. И зовется из функции потомка.
frostyfull
31 / 31 / 8
Регистрация: 13.06.2014
Сообщений: 508
23.07.2014, 16:26     Невозможно обратиться к protected член, объявленному в классе "Counter" #4
stzer, скажи, а зачем ты используешь protected?
stzer
38 / 59 / 17
Регистрация: 26.10.2013
Сообщений: 172
Завершенные тесты: 2
23.07.2014, 16:33  [ТС]     Невозможно обратиться к protected член, объявленному в классе "Counter" #5
frostyfull, для изучения тонкостей языка.

Добавлено через 1 минуту
ForEveR, просто непонятно, почему потомок не видит конструктора базового класса.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
23.07.2014, 16:39     Невозможно обратиться к protected член, объявленному в классе "Counter" #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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.07.2014, 16:42     Невозможно обратиться к protected член, объявленному в классе "Counter" #7
Цитата Сообщение от Ilot Посмотреть сообщение
Он его видит однако для того что бы создать объект его конструктор должен быть открытым. В противном случае конструирование возможно только посредством статической функции, как например это применяется в паттерне синглон.
Я мб спрошу какую-то глупую вещь, но можно выдержку из стандарта по этому поводу? Ссылка на stackoverflow или еще куда тоже сойдет.
stzer
38 / 59 / 17
Регистрация: 26.10.2013
Сообщений: 172
Завершенные тесты: 2
23.07.2014, 16:47  [ТС]     Невозможно обратиться к protected член, объявленному в классе "Counter" #8
Ilot, а вроде статическая функция работает только с статическими элементами? Нет?
HighPredator
 Аватар для HighPredator
5349 / 1732 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
23.07.2014, 16:52     Невозможно обратиться к protected член, объявленному в классе "Counter" #9
ForEveR, 11.4 Protected member access оно?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.07.2014, 17:00     Невозможно обратиться к protected член, объявленному в классе "Counter" #10
HighPredator, Я не вижу там ровным счетом ничего про данный случай, почему это я не могу создать объект базового класса просто так, а не как часть данного (в конструкторе)?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
23.07.2014, 17:01     Невозможно обратиться к protected член, объявленному в классе "Counter" #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;
}

Хотя, если быть откровенным, я уже сам запутался
stzer
38 / 59 / 17
Регистрация: 26.10.2013
Сообщений: 172
Завершенные тесты: 2
23.07.2014, 17:05  [ТС]     Невозможно обратиться к protected член, объявленному в классе "Counter" #12
Ilot, Почему там static? Он там не нужен.
И вообще я читал везде, что статический метод используется для обращения только к стат-ким полям класса.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
23.07.2014, 17:08     Невозможно обратиться к protected член, объявленному в классе "Counter" #13
Цитата Сообщение от stzer Посмотреть сообщение
Ilot, Почему там static? Он там не нужен.
Не нужен. Исправил.
Цитата Сообщение от stzer Посмотреть сообщение
И вообще я читал везде, что статический метод используется для обращения только к стат-ким полям класса.
А где в коде идет обращение к нестатическим полям?
frostyfull
31 / 31 / 8
Регистрация: 13.06.2014
Сообщений: 508
23.07.2014, 17:13     Невозможно обратиться к protected член, объявленному в классе "Counter" #14
Ilot, о я наконец допер что есть конструктор и что есть диструктор, именно в плане понимания
собственно и 5 лет не прошло с момента изучения классов
HighPredator
 Аватар для HighPredator
5349 / 1732 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
23.07.2014, 18:17     Невозможно обратиться к protected член, объявленному в классе "Counter" #15
ForEveR, а, значит я не так понял что тебе нужно, сорри.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
23.07.2014, 18:38     Невозможно обратиться к protected член, объявленному в классе "Counter" #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);
 
}
stzer
38 / 59 / 17
Регистрация: 26.10.2013
Сообщений: 172
Завершенные тесты: 2
23.07.2014, 19:00  [ТС]     Невозможно обратиться к protected член, объявленному в классе "Counter" #17
ValeryS, Спасибо, интересно
DrOffset
6442 / 3816 / 885
Регистрация: 30.01.2014
Сообщений: 6,610
23.07.2014, 19:23     Невозможно обратиться к protected член, объявленному в классе "Counter" #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 конструктор), но в то же время их можно расширять путем наследования.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.07.2014, 19:54     Невозможно обратиться к protected член, объявленному в классе "Counter" #19
Цитата Сообщение от DrOffset Посмотреть сообщение
Да можешь запросто, например из friend функции. Из нее можно и с private.
Вопрос остался: почему в методе производного класса нельзя вызвать защищённый конструктор базового?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 20:35     Невозможно обратиться к protected член, объявленному в классе "Counter"
Еще ссылки по теме:

C++ Error C2440: <function-style-cast>: невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
C++ Error C2664: RegisterClassW: невозможно преобразовать параметр 1 из "WNDCLASSEX *" в "const WNDCLASSW *"
Error C2440: =: невозможно преобразовать "void *" в "Node *" C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6442 / 3816 / 885
Регистрация: 30.01.2014
Сообщений: 6,610
23.07.2014, 20:35     Невозможно обратиться к protected член, объявленному в классе "Counter" #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 ]
Как раз привели в пример конкретную ситуацию с конструктором.
Yandex
Объявления
23.07.2014, 20:35     Невозможно обратиться к protected член, объявленному в классе "Counter"
Ответ Создать тему
Опции темы

Текущее время: 17:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru