2015-01-28 1 views
1

첫째, 저는 물리학 자입니다. 정확한 용어를 사용하지 않거나 답변을 얻지 못하면 코딩 경험과 지식이 제한적입니다. 이 질문은 이미 존재합니다. 나는 나에게 의미가있는 비슷한 것을 찾을 수 없었다.C++에서 동적으로 사용자 정의 클래스를 할당합니다. 모두 같은 공개 함수를 사용합니다.

이제 일부 양자 시스템에 대한 몬테카를로 시뮬레이션을 수행하고 있습니다.이 중에서 특정 다항식이 필요합니다. 나는 그러한 모든 다항식에 대한 수업을 작성했다. 그것들은 모두 초기화 (문자열과 정수) 할 때 동일한 인수를 사용하며, 모두 공용 메서드 만 외적 관점에서 동일합니다 (복잡한 두 배 배열을 취해 하나의 복합 double을 출력 함). 일반 사진 지금

class Polyi{ 
    public: 
     Polyi(string type, int N){ 
      ::Set things up if needed:: 
     } 

     complex<double> poly(complex<double> *z){ 
      ::Calculate the polynomial and return:: 
     } 
} 

, 나는 주어진 시뮬레이션에 사용하고자하는 다항식 내가 외부에서 입력 할 수있는 뭔가를 할 필요가있다. 나는 파이썬에 익숙하다.

if poly_type==i: polynomial = Polyi(type, N) 
elif ... 

내가하고 싶은 일이다. 후속 코드에서 polynomial.poly(z)을 사용합니다.

그러나 할당시 사용할 클래스 유형을 선언해야하기 때문에 C++에서는이 작업이 매우 어렵습니다. 나는 몇 가지 것을 시도했다. 모든 개별 다항식을 포함하는 핸들러를 만들었습니다. 일하지 않았어. 나는 또한 poly(z) 함수를 포함하여 이들 모두에 대한 기본 클래스를 만들고 각각에 과부하를 넣으려고했다. 나는 또한 여기에서 부족했다. 그러나, 그들은 실제로는 구현할 수 없기 때문에 내가 바보이기 때문에 아마도 작동하지 않았을 것입니다. 따라서

, 어떻게 내 실제 계산을 쳤을 때, 나는 변수 polynomial에서, 어떤 클래스의 원하는 다항식을 가지고 난 그냥 polynomial.poly(z)를 호출 할 수 있도록 동적 할당의이 종류를 구현할 수 있을까? 가능한 가장 간단한 해결책은 코드가 실제로 무엇을하는지 이해할 수 있기를 원하기 때문입니다.

도움 주시면 감사하겠습니다.

편집 : 모두에게 고맙습니다! 도움이되지 않는 의견/대답이 하나도 없었으며 조회 할만한 많은 제안이 없었습니다. 모두에게 감사 드려요!!!

ps. 명확히하기 위해, 그것은 중요한 포인트 인 것처럼 보이지 않지만, type 변수는 일종의 다항식 내에서 다항식의 유형을 정의합니다. 예를 들어, Pn 다항식의 경우, Pn ("1", N) = z1 + z2 + ... + zN, Pn ("2", N) = z1^2 + z2^2 + ... zN^2 더 복잡한 측면에서 나는 11122 또는 223과 같은 정수의 파티션에 의해 인덱스되는 잭 다항식을가집니다. 나는 그들과 함께 파일을 다운로드 할 수 있도록 그들을 생성하는 방법을 모릅니다. 따라서 그것은 왜 문자열입니까?

+0

'유형'문자열과 관련하여 좀 더 구체적으로 설명해 주시겠습니까? – Rerito

+1

개체를 먼저 선언 한 다음 개체를 할당하고 적절한 [복사 할당 연산자] (http://en.cppreference.com/w/cpp/language/as_operator)를 사용할 수 있습니다. –

+0

다항식을 정의하는 정수 문자열입니다. 그것이 문자열이라는 사실은 내가 관련된 모든 인자와 힘을 정의하는 텍스트 파일을 가지고있는 다항식의 일부에 유용합니다. 가장 간단한 예를 들어, 그 문자열의 각 정수는 모든 z의 합계에서 각 'z'의 거듭 제곱을 정의합니다 – user2539411

답변

1

C++의 다형성은 포인터에 의존합니다. 당신이 기본 클래스가있는 경우

폴리하고 자식 클래스 폴리 -A, Polyb, Polyi 등 .. 당신은 그러나 당신이 PolyPolya 당신이 직면하게 될 것이다 때문 유형을 포함 할 수 없습니다하는 Poly* 실제로 Polya*를 가리키는 수 있습니다 - 슬라 이싱.

class Poly_base 
{ 
    public: 
     Poly_base(string type, int N) { 
      // Potentially do stuff that you do on ALL poly 
     } 

     virtual complex<double> poly(complex<double> *z) = 0; 
} 

class Polyi : public Poly_base 
{ 
    public: 
     Polyi(string type, int N): 
      Poly_base(type, N) 
     { 
      // Stuff you would do only on Polyi. 
     } 

     virtual complex<double> poly(complex<double> *z) 
     { 
      // Your calculation for Polyi. 
     } 
} 

virtual 키워드 :

그래서 당신이 뭔가를 할 수 있습니다.이것은 다음과 같이 말합니다. 여기에는 하위 클래스에 다시 구현할 수있는 기본 클래스의 메서드가 있습니다. 실제로 Polya 인스턴스를 가리키는 Poly_base* 포인터에서 poly를 호출하면 다시 구현 된 버전이 호출됩니다. 주에서 그런

(vtable을의 마법을 통해) :

Poly *polynomial; 
if (some_condition) { 
    polynomial = new Polya(type, N); 
} else if (some_other_condition) { 
    polynomial = new Polyi(type, N); 
} 
polynomial->poly(z); 

편집 : 당신은 당신과 같이 그것을 switch 문을 수행 할 수 있도록, 대신 문자열의 열거로 당신의 유형을 할 수 있습니다 :

enum PolyType { 
    polya = 0, 
    polyb, 
    polyi 
} 

Poly_base *polynomial; 
switch (type) { 
    case polya: 
     polynomial = new Polya(type, N); 
     break; 
    case polyb: 
     polynomial = new Polyb(type, N); 
     break; 
    case .... 
} 

EDIT2 : 당신은 또한 아마 당신의 CLASSE 생성자의 유형 ..이 아키텍처의 요점이 정보가 실제로 생성 된 인스턴스에 포함되어 있다는 것입니다 필요하지 않습니다. Polya를 만든 경우 Polya가 아니라 Polya라는 것을 "알고"있습니다.

+0

이것은 분명히 크래시 코스가 아닙니다. C++에서의 다형성과 상속. 그것을 읽으십시오. 또한 Ideahat에는 점이있다 : 이것은 공장을 비명을 지른다. 그의 구현은 더욱 깨끗합니다. 상속을 마스터 한 후에도 이것을 살펴보십시오. –

0

이것은 공장 설계 패턴을위한 완벽한 장소라고 말하고 싶습니다.

class iPoly{ 
public: 
    virtual ~iPoly(){} 
    virtual complex<double> poly(complex<double> *z) = 0; 
}; 

class Polyi : public iPoly { 
public: 
    Polyi(string type, int N); 
    virtual ~Polyi(){} 
    virtual complex<double> poly(complex<double> *z); 
}; 

class Polyb : public iPoly { 
public: 
    Polyb(string type, int N); 
    virtual ~Polyb(){} 
    virtual complex<double> poly(complex<double> *z); 
}; 


iPoly* make_poly(string type, int N) { 
    if (type=="Polyi") { 
    return new Polyi(type,N); 
    } else if (type=="Polyb") { 
    return new Polyb(type,N); 
    } 
    return NULL; 
} 
+0

'Polyoly'와'Polyb'을'iPoly'에서 물려받는 것을 잊지 않았습니까? – Rerito

+0

@Rerito haha ​​yup – IdeaHat

관련 문제