2013-05-19 7 views
2

STL 1을 상속 한 고유 한 벡터 클래스를 만듭니다. 개체를 만드는 동안 문제가 있습니다.생성자 내부에서 객체 사용

여기 내 수업이 있습니다.

using namespace std; 

template <class T> 
class ArithmeticVector : public vector<T>{ 
public: 
    vector<T> vector; //maybe I should not initalize this 
    ArithmeticVector(){}; 
    ArithmeticVector(T n) : vector(n){ 
    //something here 
}; 

주; 나는 이것을 부른다.

ArithmeticVector<double> v9(5); 

또는

ArithmeticVector<int> v1(3); 

내가 v9 벡터하거나 STL 벡터 형과 같은 v1 벡터를 만드는 원하는 것은

. 그러나 내가 얻는 것은 새로 생성 된 객체 내부의 벡터입니다. 나는 먼저 물체를 벡터로 만들고 싶다.

아마도 해당 생성자 내에 해당 v1 개체를 사용해야합니까? 도와 주셔서 감사합니다.

+1

IIRC 당신도 stl 컨테이너에서 상속해서는 안됩니다. 그것을 상속하는 것보다 벡터 주위에 래퍼를 만드는 것이 더 좋습니다. – dtech

답변

4

std::vector에서 요소 단위 연산과 연산이 필요한 경우 std::valarray을 사용하십시오. 그렇지 않은 경우 std::vector을 서브 클래 싱하는 이유를 알 수 없습니다.

양식 std:: 컨테이너를 상속하지 마십시오. 가상 소멸자가 없으며 기본 포인터를 삭제하면 얼굴에 날아갑니다.

수정std::vector에서 연산을 정의해야하는 경우 클래스 외부의 연산자를 정의하고 공용 인터페이스를 사용하면됩니다. 모든

+0

내가 원하는 것은 이것이다 : 나는 벡터 v1과 v9가 벡터처럼 되길 바란다. 벡터 foo; foo (5);'하지만 내 구현에서는 내 쓸데없는 v1 v9 객체 안에 법선 벡터가 생겼다. v1과 v9는 벡터 컨테이너가 아니라 벡터처럼 취급해야합니다. – erenkabakci

+0

@Akeara :이 수업을 통해 무엇을하고 싶습니까? – rubenvb

+0

두 개의 벡터를 더하거나 나누는 것과 같이 내 벡터와 함께 작동하는 새로운 함수를 정의하고 싶습니다. 하지만 그렇게하려면 벡터 클래스를 상속해야합니다.하지만 내가 그 생성자를 호출 할 때마다 나는 v1 벡터 나 v9 벡터를 얻지 못한다고 말했었다. 벡터로 v1과 v9를 만들어야합니다. – erenkabakci

1

첫째, 당신 때문에이 라인으로 컴파일 할 수 없습니다 게시 된 코드 : 위의 전체 표준 네임 스페이스를 도입하고 있기 때문에

declaration of ‘std::vector<T, std::allocator<_Tp1> > ArithmeticVector<T>::vector’ 
/usr/include/c++/4.4/bits/stl_vector.h:171: error: changes meaning of ‘vector’ from ‘class std::vector<T, std::allocator<_Tp1> >’ 

:이 오류를 볼 수

public: 
    vector<T> vector; //maybe i should not initalize this 

이름을 "벡터"로 보이게하는 클래스 템플릿 선언을 작성한 다음이를 사용하여 객체를 선언합니다. 그건 "double double;"이라고 쓰는 것과 같습니다. 당신이 STL에 정의 된 알고리즘 다릅니다 벡터의 연산에 관심이 있다면

#include <vector> 
#include <memory> 

template 
< 
    class Type 
> 
class ArithmeticVector 
: 
    public std::vector<Type, std::allocator<Type> > 
{ 
    public: 

     ArithmeticVector() 
     : 
      std::vector<Type>() 

     {} 

     // Your constructor takes Type for an argument here, which is wrong: 
     // any type T that is not convertible to std::vector<Type>::size_type 
     // will fail at this point in your code; ArithmeticVector (T n) 
     ArithmeticVector(typename std::vector<Type>::size_type t) 
      : 
       std::vector<Type>(t) 
     {} 

     template<typename Iterator> 
     ArithmeticVector(Iterator begin, Iterator end) 
     : 
      std::vector<Type>(begin, end) 
     {} 

}; 

int main(int argc, const char *argv[]) 
{ 
    ArithmeticVector<double> aVec (3); 

    return 0; 
} 

이 (축적 :

What i want is creating v9 vector or v1 vector just like STL vector type.

이 당신이 원하는 경우 , 여기를 수행하는 코드입니다 등)을 사용하는 대신 벡터 클래스에 집중하고 멤버 함수를 추가하는 대신 특정 벡터 개념을 기대하는 벡터에 대한 일반 알고리즘을 작성할 수 있습니다. 그렇다면 상속에 대해 전혀 생각할 필요가 없으며 일반 알고리즘이 다른 개념의 벡터에서 작동 할 수 있습니다.

관련 문제