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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
#1

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

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

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" (C++):

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

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

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит! - C++
Друзья! Вот код #include &lt;stdio.h&gt; template &lt;class T&gt; class otets { protected: int peremennaya; }; template &lt;class...

В пользовательском классе "Матрица" реализовать функцию-член для вычисления определителя - C++
Прива всем. Такой вопрос. Написал класс &quot;Матрица&quot;. Хочу добавить метод для вычисления определителя. Написал функцию (&quot;не для класса&quot;)...

бинарный "++": "Counter" не определяет этот оператор или преобразование к типу приемлемо к встроенному - C++
бинарный &quot;++&quot;: &quot;Counter&quot; не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #include &lt;iostream&gt; ...

Ошибка при сборке многофайлового проекта: "невозможно преобразовать "int" в "const golf" - C++
Сделал многофайловую программу программу, вот она: //golf.h #include &lt;iostream&gt; #ifndef golg_h_ #define golf_h_ const int Len =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
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); }
};
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
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, Чего это он закрытый? Он защищенный. И зовется из функции потомка.
frostyfull
32 / 32 / 8
Регистрация: 13.06.2014
Сообщений: 508
23.07.2014, 16:26 #4
stzer, скажи, а зачем ты используешь protected?
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
23.07.2014, 16:33  [ТС] #5
frostyfull, для изучения тонкостей языка.

Добавлено через 1 минуту
ForEveR, просто непонятно, почему потомок не видит конструктора базового класса.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
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;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
23.07.2014, 16:42 #7
Цитата Сообщение от Ilot Посмотреть сообщение
Он его видит однако для того что бы создать объект его конструктор должен быть открытым. В противном случае конструирование возможно только посредством статической функции, как например это применяется в паттерне синглон.
Я мб спрошу какую-то глупую вещь, но можно выдержку из стандарта по этому поводу? Ссылка на stackoverflow или еще куда тоже сойдет.
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
23.07.2014, 16:47  [ТС] #8
Ilot, а вроде статическая функция работает только с статическими элементами? Нет?
HighPredator
5477 / 1843 / 343
Регистрация: 10.12.2010
Сообщений: 5,435
Записей в блоге: 3
23.07.2014, 16:52 #9
ForEveR, 11.4 Protected member access оно?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
23.07.2014, 17:00 #10
HighPredator, Я не вижу там ровным счетом ничего про данный случай, почему это я не могу создать объект базового класса просто так, а не как часть данного (в конструкторе)?
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
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;
}

Хотя, если быть откровенным, я уже сам запутался
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
23.07.2014, 17:05  [ТС] #12
Ilot, Почему там static? Он там не нужен.
И вообще я читал везде, что статический метод используется для обращения только к стат-ким полям класса.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
23.07.2014, 17:08 #13
Цитата Сообщение от stzer Посмотреть сообщение
Ilot, Почему там static? Он там не нужен.
Не нужен. Исправил.
Цитата Сообщение от stzer Посмотреть сообщение
И вообще я читал везде, что статический метод используется для обращения только к стат-ким полям класса.
А где в коде идет обращение к нестатическим полям?
frostyfull
32 / 32 / 8
Регистрация: 13.06.2014
Сообщений: 508
23.07.2014, 17:13 #14
Ilot, о я наконец допер что есть конструктор и что есть диструктор, именно в плане понимания
собственно и 5 лет не прошло с момента изучения классов
HighPredator
5477 / 1843 / 343
Регистрация: 10.12.2010
Сообщений: 5,435
Записей в блоге: 3
23.07.2014, 18:17 #15
ForEveR, а, значит я не так понял что тебе нужно, сорри.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 18:17
Привет! Вот еще темы с ответами:

Где ошибка невозможно преобразовать указатель "this" из "const pers" в "pers &" при выводе объектов через cout - C++
Добрый день! Переписал код из книг Лафоре, создание мультимножества из собственных объектов- справочник телефонный, с именем и фамилией. ...

Error C2440: инициализация: невозможно преобразовать "void *" в "listnode *". подскажите, что можно сделать? - C++
#include &lt;iostream&gt; struct listnode { char *data; int value; struct listnode *next; }; struct listnode...

error C2664: CWnd::MessageBoxW: невозможно преобразовать параметр 2 из "long" в "LPCTSTR" - C++
при компиляции выдаёт ошибку указанную в теме, код: void Clab_12_2Dlg::OnClickedAri() { // TODO: добавьте свой код обработчика...

Error C2664: RegisterClassW: невозможно преобразовать параметр 1 из "WNDCLASSEX *" в "const WNDCLASSW *" - C++
почему выдаёт ошибку? int RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground){ WNDCLASSEX wc; ...


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

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

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