2009-03-27 8 views
5

클래스 계층 구조가 있습니다. 기본 클래스는 파일에서로드 할 수있는 (그리고 런타임 중에 다시로드 할 수있는) 몇 가지 조정 매개 변수를 사용합니다. 파생 된 각 클래스는 몇 가지 추가 매개 변수를 추가 할 수 있습니다. 나는 기본 생성자에서 올바르게 크기가 지정된 매개 변수 배열을 할당하는 방법을 찾고 있으므로 파생 클래스에서 할당을 해제하고 다시 할당 할 필요가 없습니다. 이 같은 뭔가를 기대했다하지만 (매개 변수는 항상 두 요소가) 작동하지 않습니다 :파생 클래스를 기반으로 크기가 기본 생성자에서 배열을 할당하는 방법?

class Base 
    { static int nParms; 
    virtual int getNParms() { return nParms;} 
    float *parameters; 
    public: 
    Base() 
    { parameters= new float[this->getNParms()]; 
     parameters[0] = globalReloadableX; 
     parameters[1] = globalReloadableY; 
    } 
    }; 
    int Base::nParams =2; 

    class Derived : public Base 
    { static int nParms; 
    virtual int getNParms() { return nParms;} 
    public: 
    Derived() : Base() 
    { parameters[2] = globalReloadableZ; 
    } 
    } 
    int Derived::nParams =3; 

내가 this question을 본 적이 있지만이 솔루션은 나를 위해 잘 작동이하지 않습니다. 나는 또한 매개 변수를 정기적으로 각 클래스의 배열을 만드는 시도 :

class Base 
    { float parameters[2] 
    ... 
    class Derived : public Base 
    { float parameters[3] 
    ... 

을하지만 그 파생 만드는 것은이 개 별도의 배열을 가지고있다.

아이디어가 있으십니까?

답변

5

왜 필요한 배열 크기를 기본 클래스의 생성자에서 매개 변수로 전달하지 않습니까?

(즉, C++ 가상 함수가 작동하는 방식이기 때문에 가상 함수는 파생 클래스 호출하지 않는 이유는,., 개념적 파생 클래스 생성자가 완료 될 때까지, 오브젝트의 형태는 여전히 기본 클래스입니다)

+0

왜 그렇지 않습니까? 너무 분명하다! 때때로 나는 세부 사항에 너무 싸서 너무 ... 이유에 대한 설명 주셔서 감사합니다. – AShelly

+0

아무 문제 없어, 모든 사람에게 발생합니다! –

2

크기를 매개 변수로 만드는 것은 어떻습니까?

class Base 
{ static int nParms; 
    virtual int getNParms() { return nParms;} 
    float *parameters; 
public: 
    Base(int n = nParams) 
    { parameters= new float[n]; 
    parameters[0] = globalRelodableX; 
    parameters[1] = globalRelodableY; 
    } 
}; 
int Base::nParams =2; 

class Derived : public Base 
{ static int nParms; 
    virtual int getNParms() { return nParms;} 
public: 
    Derived() : Base(nParams) 
    { parameters[2] = globalRelodableZ; 
    } 
} 
int Derived::nParams =3; 
2

왜 배열을 사용합니까? std :: vector를 사용하면 파생 된 클래스에서 필요한만큼의 매개 변수를 사용할 수 있습니다. 기본 클래스는 필요한 개수를 알지 못합니다.

+0

좋은 지적입니다. 나는 실제로 다른 장소에서 벡터를 사용하고 있습니다. 하지만 여전히 C로 대부분의 일을 처리하므로 기능을 추가 할 때 내가 아는 바에 대한 경향이 있습니다 ... – AShelly

0

std :: map을 사용하는 것이 좋습니다. 기본으로 성장할 수 있고 다른 매개 변수가 사용하는 매개 변수의 수를 신경 쓰지 않아도됩니다. 키/값 쌍은 응용 프로그램에 따라 다르지만 해당 숫자 인덱스를 관리하는 것이 더 쉽습니다.

0

필자는 필요한 것에 따라 Earwicker와 Steve의 답변을 좋아합니다. 이러한 객체가 자주 생성되어 파괴되는 경우, 최소의 메모리 할당이 가능하므로 Earwicker 's가 더 우수합니다. 그러나 이것이 일반적으로 "만들어지고 드물게 다시 만들어지는"것이라면 Steve의 답변을 참조하십시오. 맵은 일반적으로 작업하기가 훨씬 쉽고 필요에 따라 동적으로 커지므로 너무 많은 오버 헤드가 발생할 수 있습니다. 이 물건은 무언가 만들어지고 파괴되었습니다.

2

다른 사람이 제안한 것처럼 생성자에 매개 변수를 만들 수도 있지만 크기를 매개 변수로 사용하여 Base 클래스를 템플릿 클래스로 만들 수도 있습니다. 배열에 대한 힙 할당의 필요성 제거 등 많은 이점이 있습니다.

template <size_t nParams> 
class Base 
{ 
    float parameters[nParams]; 
public: 
    Base() 
    { // could use a static_assert(nParams > 1) here... 
     parameters[0] = globalRelodableX; 
     parameters[1] = globalRelodableY; 
    } 
}; 

class Derived : public Base<3> // or whatever 
{ 
public: 
    Derived() 
    { parameters[2] = globalRelodableZ; } 
};