Help!!!!!!!! указатель из статичной функции
От: Liss1  
Дата: 05.10.01 01:46
Оценка:
в классе Класс1 обьявлена статичная функция

в другом классе Класс2 эта функция вызывается

цель передать указателю m_pSmeta2 в классе2 значение указателя m_pSmeta1

из класса1



класс1.h

класс1:

Interface* m_pSmeta1;

..........

static void Класс1::GetPointerSmeta(void** pSmeta)

{

*pSmeta = m_pSmeta1;

}





класс2.h



класс2:

Interface* m_pSmeta2;



класс2.сpp

#include "класс1.h"

......

Класс1::GetPointerSmeta((void**)& m_pSmeta2);

......



компилятор выдает ошибку

error C2597: illegal reference to data member 'Класс1::m_pSmeta' in a static member function

такая же ошибка появляется в класс2 при



m_pSmeta2 = Класс1::m_pSmeta1;



как правильно реализовать присваивание указателей или можно как то это реализовать без использования статичных функций??
Re: Help!!!!!!!! указатель из статичной функции
От: ZORK Россия www.zorkaltsev.com
Дата: 05.10.01 02:19
Оценка:
Здравствуйте Liss1, Вы писали:

L>в классе Класс1 обьявлена статичная функция


L>в другом классе Класс2 эта функция вызывается


L>цель передать указателю m_pSmeta2 в классе2 значение указателя m_pSmeta1


L>из класса1


Статическая функция класса, это просто функция, и про класс можно забыть. То есть, указатель на функции A::f из

class A {
    static int f(int n) { return 0; }
};


можно использовать следующим образом

int q(void (*func)(int))
{
    return func(12);
}

...

int n = q(A::f);


-Zork
Думать надо ...головой :)
Re[2]: Help!!!!!!!! указатель из статичной функции
От: ZORK Россия www.zorkaltsev.com
Дата: 05.10.01 02:28
Оценка:
Здравствуйте ZORK, Вы писали:

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


L>>в классе Класс1 обьявлена статичная функция


L>>в другом классе Класс2 эта функция вызывается


L>>цель передать указателю m_pSmeta2 в классе2 значение указателя m_pSmeta1


L>>из класса1


ZORK>Статическая функция класса, это просто функция, и про класс можно забыть. То есть, указатель на функции A::f из


ZORK>
ZORK>class A {
ZORK>    static int f(int n) { return 0; }
ZORK>};
ZORK>


ZORK>можно использовать следующим образом


ZORK>
ZORK>int q(void (*func)(int))
ZORK>{
ZORK>    return func(12);
ZORK>}

ZORK>...

ZORK>int n = q(A::f);
ZORK>


ZORK>-Zork


Я еще раз перечитал вопрос, и не уверен что я на него ответил. Так что было бы полезнее рассказать другими словами, что нужно. Варианты, которые у меня возникли:
— нужно передать указатель на интерфейс, а потом вызывать функцию этого интерфейса
— нужно из статической функции вызвать нестатический метод и/или использовать нестатические данные класса
— или все-таки передать поинтер на класс, что-б потом вызвать его статический метод. Что не возможно, но можно передать указатель на статический метод класса, а потом его вызвать, как я показал это в первом варианте ответа

-Zork
Думать надо ...головой :)
Re[3]: Help!!!!!!!! указатель из статичной функции
От: Liss1  
Дата: 05.10.01 03:05
Оценка:
Здравствуйте ZORK, Вы писали:

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


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


L>>>в классе Класс1 обьявлена статичная функция


L>>>в другом классе Класс2 эта функция вызывается


L>>>цель передать указателю m_pSmeta2 в классе2 значение указателя m_pSmeta1


L>>>из класса1


ZORK>>Статическая функция класса, это просто функция, и про класс можно забыть. То есть, указатель на функции A::f из


ZORK>>
ZORK>>class A {
ZORK>>    static int f(int n) { return 0; }
ZORK>>};
ZORK>>


ZORK>>можно использовать следующим образом


ZORK>>
ZORK>>int q(void (*func)(int))
ZORK>>{
ZORK>>    return func(12);
ZORK>>}

ZORK>>...

ZORK>>int n = q(A::f);
ZORK>>


ZORK>>-Zork


ZORK>Я еще раз перечитал вопрос, и не уверен что я на него ответил. Так что было бы полезнее рассказать другими словами, что нужно. Варианты, которые у меня возникли:

ZORK>- нужно передать указатель на интерфейс, а потом вызывать функцию этого интерфейса
да именно так те мне нужно чтобы указатель pSmeta2 в классе2 указывал на указатель m_pSmeta1
и впоследствии я мог вызывать из класса2 функции интерфейса
ZORK>- нужно из статической функции вызвать нестатический метод и/или использовать нестатические данные класса
и это тоже правильно по отношению к классу1
ZORK>- или все-таки передать поинтер на класс, что-б потом вызвать его статический метод. Что не возможно, но можно передать указатель на статический метод класса, а потом его вызвать, как я показал это в первом варианте ответа

ZORK>-Zork
Re[4]: Help!!!!!!!! указатель из статичной функции
От: ZORK Россия www.zorkaltsev.com
Дата: 05.10.01 03:25
Оценка:
Здравствуйте Liss1, Вы писали:

ZORK>>- нужно передать указатель на интерфейс, а потом вызывать функцию этого интерфейса

L>да именно так те мне нужно чтобы указатель pSmeta2 в классе2 указывал на указатель m_pSmeta1
L>и впоследствии я мог вызывать из класса2 функции интерфейса

Если нужен интерфейс, то функции надо описывать как виртуальные, так как тогда виртуальная таблица виртуальных методов будет их объединять, а статические функции, это просто функции, и между ними практически ничего общего, ну кроме начал подписи (signature), которая есть имя класса. На всякий случай пример кода:

interface I1 {
    virtual void method1(int n) = 0;
    virtual int method2(char* str) = 0;
};

class A : public I1 {
    void method1(int n) { ... }
    int method2(char* str) { ...}
};


при этом можно делать:

I* abstractInterface = new A();

abstractInterface->method2("Nothing");



ZORK>>- нужно из статической функции вызвать нестатический метод и/или использовать нестатические данные класса

L>и это тоже правильно по отношению к классу1

Ну тут надо откуда-то добыть указатель на какой-нить объект этого класса, так как сама статическая функция к объекту не относится. И при этом, важно понимать, что ты все равное не сомжешь вызвать статическую функцию класса, через указательно на объект.

Пример:

class A {
    virtual void f(int n) {  }

    int do(A* obj) {
        obj->f();
    }
}

...

A* a = new A();
A::do(a);


Если же указатель передан как void* или как указатель на super-class, то для этого надо использовать static_cast или reinterpret_cast. Более широко и шумно, это обсуждалось здесь http://www.rsdn.ru/forum/?action=message&gid=9&mid=4612
Автор: Clover
Дата: 21.08.01


-Zork
Думать надо ...головой :)
Re: Help!!!!!!!! указатель из статичной функции
От: Liss1  
Дата: 05.10.01 04:41
Оценка:
Здравствуйте Liss1, Вы писали:

L>в классе Класс1 обьявлена статичная функция


L>в другом классе Класс2 эта функция вызывается


L>цель передать указателю m_pSmeta2 в классе2 значение указателя m_pSmeta1


L>из класса1




L>класс1.h


L>класс1:


L>Interface* m_pSmeta1;


L>..........


L>static void Класс1::GetPointerSmeta(void** pSmeta)


L>{


L>*pSmeta = m_pSmeta1;


L>}



Все понял не дурак :)
большое спасибо



L>класс2.h




L>класс2:


L>Interface* m_pSmeta2;




L>класс2.сpp


L>#include "класс1.h"


L>......


L>Класс1::GetPointerSmeta((void**)& m_pSmeta2);


L>......




L>компилятор выдает ошибку


L>error C2597: illegal reference to data member 'Класс1::m_pSmeta' in a static member function


L>такая же ошибка появляется в класс2 при




L>m_pSmeta2 = Класс1::m_pSmeta1;




L>как правильно реализовать присваивание указателей или можно как то это реализовать без использования статичных функций??
Re[4]: Help!!!!!!!! указатель из статичной функции
От: Liss1  
Дата: 05.10.01 04:42
Оценка:
Здравствуйте Liss1, Вы писали:

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


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


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


L>>>>в классе Класс1 обьявлена статичная функция


L>>>>в другом классе Класс2 эта функция вызывается


L>>>>цель передать указателю m_pSmeta2 в классе2 значение указателя m_pSmeta1


L>>>>из класса1


ZORK>>>Статическая функция класса, это просто функция, и про класс можно забыть. То есть, указатель на функции A::f из


ZORK>>>
ZORK>>>class A {
ZORK>>>    static int f(int n) { return 0; }
ZORK>>>};
ZORK>>>


ZORK>>>можно использовать следующим образом


ZORK>>>
ZORK>>>int q(void (*func)(int))
ZORK>>>{
ZORK>>>    return func(12);
ZORK>>>}

ZORK>>>...

ZORK>>>int n = q(A::f);
ZORK>>>


ZORK>>>-Zork


ZORK>>Я еще раз перечитал вопрос, и не уверен что я на него ответил. Так что было бы полезнее рассказать другими словами, что нужно. Варианты, которые у меня возникли:

ZORK>>- нужно передать указатель на интерфейс, а потом вызывать функцию этого интерфейса
L>да именно так те мне нужно чтобы указатель pSmeta2 в классе2 указывал на указатель m_pSmeta1
L>и впоследствии я мог вызывать из класса2 функции интерфейса
ZORK>>- нужно из статической функции вызвать нестатический метод и/или использовать нестатические данные класса
L>и это тоже правильно по отношению к классу1
ZORK>>- или все-таки передать поинтер на класс, что-б потом вызвать его статический метод. Что не возможно, но можно передать указатель на статический метод класса, а потом его вызвать, как я показал это в первом варианте ответа

ZORK>>-Zork



Все понял не дурак :)
большое спасибо
Re: Help!!!!!!!! указатель из статичной функции
От: The Lex Украина  
Дата: 05.10.01 12:09
Оценка:
Прошу прощения, я что-то не очень въехал в вашу дискуссию, но мне интересно: а почему возник вопрос о статической функции?
Голь на выдумку хитра, однако...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.