2013-03-18 1 views
0

하나의 클래스에서 함수 포인터 벡터를 사용하고 다른 클래스에서 함수 주소를 전달하려고합니다. 다음 구현에서는 오류가 발생합니다. 올바른 방법은 무엇입니까?C++ 특정 클래스에서 함수 포인터를 다른 클래스의 멤버로 생성

class A 
{ 
public: 
void func() 
{ 
} 
}; 

class B 
{ 
public: 
std::vector<void(*)()) myVec; 
void update_func() 
{ 
    myVec.push_back(&A::func); 
} 
}; 

int main() 
{ 
B* b = new B; 
b->update_func(); 
return 0; 
} 
+4

실제 코드를 붙여 넣습니다. 게시 한 내용은 수많은 오타 및 바보 같은 오류가 있습니다. –

+1

그리고 전체 오류도 게시하십시오. – JSQuareD

+1

'func()'은 여전히 ​​private입니다. myVec가 올바르게 선언되지 않았다. 문제가있는 실제 코드를 게시하십시오. –

답변

3

포인터를 이러한 기능을 사용할 수 없습니다 형식이 void(A::*)(void)입니다. 따라서 원하는 요소와 일치하도록 벡터를 변경하거나 벡터에 대해 올바른 유형의 함수에 대한 포인터를 사용하십시오.

+0

ok ... 감사합니다 ... 멤버 함수를 정적으로 만들지 않고 push_back을 수행하는 다른 방법은 없습니까? – raveesh

+1

@ user1783299 : 실제로는 아닙니다. 비 정적 멤버 함수 포인터는 클래스 'A'의 인스턴스에서 호출되어야합니다. 'void (*) (void)'는 전역 변수에 저장하지 않는 한 그 인스턴스를 제공 할 수 없거나 비슷하게 불만족 스럽다. C++ 11에서는'std :: function' (벡터의 요소 유형)과'std :: bind' (지정된 객체에서 지정된 멤버 함수를 호출하는 요소 유형의 인스턴스를 얻기 위해)). C++ 03에서는 Boost에 등가물이 있습니다. –

+0

괜찮아요 ... 내가 func() 내에서 myVec을 사용하고 어떻게 든 func()의 주소를 myVec에 전달합니까? – raveesh

0

이 코드는 많은 문제가 있습니다 .. 당신이 무효 업데이트 FUNC()이 무엇인지 그 기능 .. 초 .. 호출 할 경우 처음 B-가> FUNC가 후) (이 있어야합니다 .. 나쁜도 그들은 개인이기 때문에 코드는 .. 세 번째는 유형 void(*)(void)이없는 비 정적 멤버 함수 A::func에 ... 당신은 그러나 벡터에 제대로 밀어 않습니다 ...

+0

이것은 올바른 설명이지만 질문에 대한 답변이 아닙니다. –

+0

나는 곧바로 의견을 말하기에 충분한 담당자가 있기를 바라고있다. hmm – Alon

+0

ok ... 나의 실수 ... 나는 변경했다. – raveesh

1

A의 func() 함수 포인터의 선언과 일치하도록 정적이어야합니다. 한편, 클래스 B에 액세스 할 수 있도록 public이어야합니다. B에서 update_func()도 공개되어야합니다. 그렇지 않으면 main에 액세스 할 수 없으므로 공개해야합니다. 벡터 선언에 오타가있는 경우 vector<)이 아닌 vector<>이어야합니다. //

class A 
{ 
    public: 
    static void func() 
    { 
    } 
}; 

class B 
{ 
std::vector<void(*)()> myVec; 
public void update_func() 
{ 
    myVec.push_back(&A::func); 
} 
}; 

int main() 
{ 
B* b = new B; 
b->update_func(); 
return 0; 
}