2016-06-03 2 views
0

저는 Menu 클래스를 코딩하려고하는 초보자이며 다른 클래스의 일부인 함수를 호출 할 수 있기를 원합니다. 나는 인터넷에서 철저히 연구했지만, 내가 찾은 대답은 나의 필요에 맞지 않는다.다른 클래스의 클래스 함수를 C++의 포인터를 통해 호출하십시오.

나는 주위를 엉망
#include <iostream> 

class Class1;//forward declaration 
typedef void (Class1::*FunctionPtr_t)();//type: Pointer to a function in Class1 scope 

class Class1 
{ 
public: 
    void function1() 
    {std::cout << "function1 executed!";}//Test function to execute from Class2 
}; 

class Class2 
{  
public: 
    FunctionPtr_t myfcnptr = NULL;//Pointer to a function in Class1 
}; 

int main() 
{ 
    Class2 myclass2; 

    myclass2.myfcnptr = &Class1::function1;//Assign function to pointer (Everything OK here) 
    (myclass2.*myfcnptr)();//Compilation Error: 'myfcnptr' was not declared in this scope 
} 

이 두 클래스 친구를 만들어 거의 모든 곳에서 범위 연산자를 사용 :

여기에 내 문제를 정의하는 코드의 간단한 조각이다. 나는 해결책이 아주 쉬워야하고 우스 꽝스러운 실수를하고 있음을 알고 있지만 나는 그것을 잡지 못한다! 양해 해 주셔서 감사합니다.)

+1

해당 클래스의 멤버 함수를 호출하려면 'Class1'객체가 필요합니다. 함수 포인터로 정말 엉망이 필요합니까? – user463035818

+0

당신은 원래의 문제와 달성하고자하는 것을 더 잘 설명해야합니다. 함수 포인터가 필요한 이유와 게시 한 코드가 왜 명확하지 않기 때문에 [xy 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)처럼 보입니다 (공격) 작은 의미가 내게 – user463035818

+0

의도 범죄;). Arduino 프로젝트의 메뉴를 만들려고하는데 각 메뉴 옵션이 함수를 트리거합니다.메뉴 클래스는 일반적이므로 함수의 일반적인 배열을 관리 할 수 ​​있어야하며 궁극적으로 건설 프로세스에서 지정됩니다. 그러나 일부 기능은 다른 클래스에 속합니다. 예를 들어, 메뉴는 데이터베이스 클래스에 의해 관리되는 데이터베이스에 액세스합니다. 그러나 메뉴 클래스에는 함수 (예 : readData)에 대한 참조가 전달되고이를 호출 할 수 있어야합니다. – Leo

답변

1

올바른 구문은 (myclass2.*myclass2.myfcnptr)();입니다.

그러나 귀하의 경우 Class1Class2은 관련이 없으므로 Class2Class1에서 회원 기능을 현명하게 호출 할 수 없습니다. 이 호출을 수행하려면 Class1 또는 Class1에서 파생 된 인스턴스가 필요합니다.

+0

해결 됨 -> 아주 가까운 !!! 올바른 구문은'(myclass1. * myclass2.myfcnptr)();'이며, 여기서'myclass1'은'Class1'의 인스턴스입니다. 네가 그런 뜻인지는 모르겠지만, 어쨌든 네가 나를 바른 길로 밀었 다.) 고마워 !! – Leo

+0

@Leo 구문과 구문 사이에서 대답을 나누었습니다.하지만 어쩌면 그것이 명확하지 않을 수도 있습니다 ... – Quentin

0

멤버 함수 포인터를 통해 멤버 함수를 호출하려고했지만 호출 대상이 Class1 인 경우를 지정하지 않았습니다. 예를 들어

: 나는에 대해 호출 할 인스턴스를 지정 했어

FunctionPtr_t func = &Class1::function1; 
Class1 instance; 
(instance.*func)(); 

알 수 있습니다. 포인터는 함수를 참조합니다. 이것은 함수를 참조 할 수있는 C# 같은 언어와 다르고 그 참조는 함수를 포함하는 객체를 추적합니다.

0

궁극적으로 C++의 클래스 상속 시스템을 사용하여 Class1Class2 두 클래스 사이의 관계를 만들어야합니다. 앞에서 언급했듯이 Class2은 관계가 없어도 회원 기능을 Class1이라고 부를 수 없습니다. 또한 제공하는 다음 virtual으로 부모 클래스 Class1의 원래 기능을 표시하고 싶을

class Class2 : public Class1 
{ // ... 

: 당신은 아마, 클래스 정의의 첫 번째 줄에 이런 식으로 뭔가를 작성하여 Class1을 확장 할 Class2가 발생할 수 있습니다 하위 클래스의 함수 정의 Class2.

C++의 클래스 상속, 다형성, virtual 키워드 등에 대해 배우려면 훌륭한 리소스가 http://www.cplusplus.com/doc/tutorial/polymorphism/이 될 것입니다.

1

Class1의 인스턴스화가 필요하지 않은 경우 function1 static 메서드를 만들어 Class2 인스턴스에서 직접 호출 할 수도 있습니다. 다음 코드가 컴파일됩니다 :

#include <iostream> 


typedef void (*FunctionPtr_t)();//PAY ATTENTION TO THE NEW typedef ! 

class Class1 
{ 
public: 
    static void function1() //STATIC METHOD 
    {std::cout << "function1 executed!";}//Test function to execute from Class2 
}; 

class Class2 
{  
public: 
    FunctionPtr_t myfcnptr = NULL;//Pointer to a function in Class1 
}; 

int main() 
{ 
    Class2 myclass2; 

    myclass2.myfcnptr = &Class1::function1;//Assign function to pointer 
    (*(myclass2.myfcnptr))(); 
} 
관련 문제