Re[2]: Доступ к адресу static private-функции
От: rg45 СССР  
Дата: 15.03.06 11:00
Оценка: +1 :)
"rg45" <49596@users.rsdn.ru> wrote in message news:1783717@news.rsdn.ru...

>
> void test2(FuncPointer p_Func = test);
>

>
> Этот фрагмент нельзя квалифицировать как обращение к test изнутри класса.
> Вызов test2(); полностью идентичен вызову test2(&A::test); и поэтому такой вызов можно сделать либо из функции-члена класса A, либо из дружественной функции.
> Фуункция main не объявлена в классе A как дружественная, поэтому из нее этот вызов запрещен.

Прошу прощения, я наврал.
Так вызвать нельзя: test2(&A::test);, а так: test2(); можно.
Posted via RSDN NNTP Server 1.9
--
Справедливость выше закона. А человечность выше справедливости.
Re: Доступ к адресу static private-функции
От: TSS Россия http://www.sdl.ru
Дата: 15.03.06 10:25
Оценка: 2 (1)
Здравствуйте, bolshik, Вы писали:

B> знатоки, помогите советом -- правильно ли с точки зрения стандарта, что следующий код не компиллится с причиной


B>

B>error C2248: 'A::test' : cannot access private member declared in class 'A'
B> c:\Work\...\test.cpp(38) : see declaration of 'A::test'
B> c:\Work\...\test.cpp(36) : see declaration of 'A'


ты не можешь напрямую из main() вызывать приватного мембера класса A. Вот компилятор и ругается

B>
B>class A {    
B>    typedef void (*FuncPointer)();
B>    static void test() { printf("A::test()\n"); }
B>public:
B>    void test2(FuncPointer p_Func = test) { (*p_Func)(); }
B>};

B>void another() {
B>    printf("another\n");
B>}

B>int main() {
B>    A a;
B>    a.test();
B>    a.test2(another);

B>    return 0;
B>}
B>


B> ведь все member'ы одного класса имеют доступ друг к другу?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Signed, [TSS] /SDL/
Re[3]: Доступ к адресу static private-функции
От: Павел Кузнецов  
Дата: 15.03.06 21:34
Оценка: 1 (1)
Здравствуйте, rg45, Вы писали:

R>Так вызвать нельзя: test2(&A::test);, а так: test2(); можно.


+1

11/7 The names in a default argument expression (8.3.6) are bound at the point of declaration, and access is checked at that point rather than at any points of use of the default argument expression.

Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Доступ к адресу static private-функции
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 15.03.06 09:53
Оценка:
знатоки, помогите советом -- правильно ли с точки зрения стандарта, что следующий код не компиллится с причиной

error C2248: 'A::test' : cannot access private member declared in class 'A'
c:\Work\...\test.cpp(38) : see declaration of 'A::test'
c:\Work\...\test.cpp(36) : see declaration of 'A'


class A {    
    typedef void (*FuncPointer)();
    static void test() { printf("A::test()\n"); }
public:
    void test2(FuncPointer p_Func = test) { (*p_Func)(); }
};

void another() {
    printf("another\n");
}

int main() {
    A a;
    a.test();
    a.test2(another);

    return 0;
}


ведь все member'ы одного класса имеют доступ друг к другу?
http://denis-zhdanov.blogspot.com
Re: Доступ к адресу static private-функции
От: rg45 СССР  
Дата: 15.03.06 10:20
Оценка:
"bolshik" <29601@users.rsdn.ru> wrote in message news:1783614@news.rsdn.ru...
> знатоки, помогите советом -- правильно ли с точки зрения стандарта, что следующий код не компиллится с причиной
>
> class A { 
> typedef void (*FuncPointer)();
> static void test() { printf("A::test()\n"); }
> public:
> void test2(FuncPointer p_Func = test) { (*p_Func)(); }
> };
>

>
> ведь все member'ы одного класса имеют доступ друг к другу?

void test2(FuncPointer p_Func = test);


Этот фрагмент нельзя квалифицировать как обращение к test изнутри класса.
Вызов test2(); полностью идентичен вызову test2(&A::test); и поэтому такой вызов можно сделать либо из функции-члена класса A, либо из дружественной функции.
Фуункция main не объявлена в классе A как дружественная, поэтому из нее этот вызов запрещен.
Posted via RSDN NNTP Server 1.9
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Доступ к адресу static private-функции
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 15.03.06 10:29
Оценка:
Здравствуйте, rg45, Вы писали:

R>Этот фрагмент нельзя квалифицировать как обращение к test изнутри класса.

R>Вызов test2(); полностью идентичен вызову test2(&A::test); и поэтому такой вызов можно сделать либо из функции-члена класса A, либо из дружественной функции.
R>Фуункция main не объявлена в классе A как дружественная, поэтому из нее этот вызов запрещен.

на самом деле, только сейчас заметил...
Вместо
int main() {
    A a;
    a.test();
    a.test2(another);

    return 0;
}


надо писать

int main() {
    A a;
    a.test2();
    a.test2(another);

    return 0;
}


Тогда все хорошо и, следовательно, test2() != test2(&A::test).
http://denis-zhdanov.blogspot.com
Re[2]: Доступ к адресу static private-функции
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 15.03.06 10:30
Оценка:
Здравствуйте, TSS, Вы писали:

TSS>Здравствуйте, bolshik, Вы писали:


B>> знатоки, помогите советом -- правильно ли с точки зрения стандарта, что следующий код не компиллится с причиной


B>>

B>>error C2248: 'A::test' : cannot access private member declared in class 'A'
B>> c:\Work\...\test.cpp(38) : see declaration of 'A::test'
B>> c:\Work\...\test.cpp(36) : see declaration of 'A'


TSS>ты не можешь напрямую из main() вызывать приватного мембера класса A. Вот компилятор и ругается


ага, очепятка
http://denis-zhdanov.blogspot.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.