2013-05-03 3 views
0

가독성을 위해 코드를 단락시키면서 너무 많이 변경하고 실수를 저지르고 있습니다. 이것은 여전히 ​​압축되어 있지만 코드에서 바로 가져온 것입니다.C++ 함수에 대한 포인터의 다형성 포인터 전달

내 문제는 "function"이라는 클래스와 "virtual"연산자가있는 파생 클래스 "pwfunction"이 있다는 것입니다. "실제"함수에 대한 "함수"객체에 대한 포인터 배열을 전달하고() 연산자를 사용하고 싶습니다.

최종 수정 : 이것은 내가 말하는 것에 대한 SSCCE 버전입니다.

#include <iostream> 

using namespace std; 

class function 
{ 
public: 
    virtual double operator() (double x) {return 1.5;} 
}; 

class pwfunction : public function 
{ 
public: 
    virtual double operator() (double x) {return 2.0;} 
}; 

void interface(); 
void definefuncs (function** funcs, long unsigned numfuncs); 
void interpolate(function* infunc); 
void solvefuncs(function** funcs, long unsigned numfuncs); 

int main() 
{ 
    interface(); 
    return 0; 
} 

void interface() 
{ 
    long unsigned numfuncs = 1; 
    function* funcs[numfuncs]; 

    definefuncs(funcs, numfuncs); 

    solvefuncs(funcs, numfuncs); 
} 

void definefuncs (function** funcs, long unsigned numfuncs) 
{ 
    interpolate(funcs[0]); 
} 

void interpolate(function* infunc) 
{ 
    infunc = new pwfunction(); 
    cout<< (*infunc)(1.5)<<endl; //works 
} 

void solvefuncs(function** funcs, long unsigned numfuncs) 
{ 
    cout<< (*funcs[0])(1.5); //Error Message: Segmentation fault 
} 
+1

[Works for me] (http://ideone.com/iYbOyN)와 같은 원래 변수를 할당해야합니다. valgrind도 불만 없습니다. 코드를 한 번 실수로 복사 한 경우 다른 코드도 만들 수 있습니까? 여기에 SSCCE를 붙여넣고 붙여 넣은 코드가 실제로 자신이 주장하는 행동을 나타내도록하십시오. – MvG

답변

0

문제는 다음에서 제공 :

void interpolate(function* infunc) 
{ 
    infunc = new pwfunction(); 
    cout<< (*infunc)(1.5)<<endl; //works 
} 

아마 당신이 원하는 일을하지 않습니다. infunc는 로컬에 할당되며,이 함수는 외부 또는이 함수에 영향을 미치지 않습니다 (메모리 누수가 발생합니다). Interpolate는 infunc을 반환하거나

void interpolate(function*& infunc) ... 
+0

예, 개체에 적절한 컨테이너를 구현할 때 메모리 누수가 잠시 처리됩니다. 이 프로그램은 데이터 목록을 다양한 수학 함수로 보간하고 그것에 대한 수치 해석을 수행하도록 설계되었습니다. 하지만 포인터를이 포인터로 전달할지라도 포인터를 복사하여 새로운 pwfunction에는 복사하지만 원래 포인터는 그렇지 않다는 것을 의미합니다. – user2303321

+0

필자가 의도 한 바는'infunc = new pwfunction();'은 실제로 할당하고있는 함수를 interpolate()에 전달 된 변수의 복사본에 할당한다는 것입니다. 따라서 2 가지 결과 : 원래 변수는 여전히 변경되지 않고 (초기화되지 않음) 충돌을 일으키고 메모리 누수가 발생합니다. – Jem

+0

우후! 감사! 포인터를 참조로 전달할 수 있는지 몰랐습니다. – user2303321

0

당신은 somefunctionfunclist 데이터 배열을 할당하지 않기 때문에 아무것도 발생할 수 있습니다. 아마 당신은

func* funclist[1]; 

func 포인터의 한 요소 배열을 표시하는 것을 의미한다.

+0

예, 그건 오타였습니다. 나는 아직도 문제가있다. – user2303321

관련 문제