2013-05-19 5 views
2

Я создаю свой собственный векторный класс, наследующий STL. У меня проблема при создании объекта.Использование объекта внутри конструктора

Вот мой класс.

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 вектор или вектор v1 так же, как STL векторного типа. Но я получаю вектор внутри моего вновь созданного объекта. Я хочу, чтобы мой объект сначала был вектором.

Возможно, мне нужно использовать этот объект v1 внутри конструктора? Спасибо за помощь.

+1

IIRC вы даже не должны унаследовать от stl контейнеров. Лучше сделать обертку вокруг вектора, чем наследовать ее. – dtech

ответ

4

Если вам нужны поэлементные операции и математика на std::vector, используйте std::valarray. Если нет, я не понимаю, почему вы подклассифицируете std::vector.

Не наследуйте формы std:: контейнеров, они не имеют виртуального деструктора и будут взорваться на вашем лице, если они удалены из указателя на базу.

EDIT Если вам нужно определить операции на std::vector, вы можете определить операторы вне класса и использовать его общедоступный интерфейс.

+0

что я хочу это: я хочу, чтобы эти v1 и v9 были вектором типа 'vector foo; foo (5); 'но с моей реализацией я получаю нормальный вектор внутри моих бесполезных объектов v1 v9. Мне нужно рассматривать v1 и v9 как вектор, а не векторный контейнер. – erenkabakci

+0

@Akeara: что вы хотите сделать * с этим классом? – rubenvb

+0

Я хочу определить новые функции для работы с моими векторами, такими как добавление или деление двух векторов. Но для этого мне нужно наследовать векторный класс.Но, как я сказал, когда я называю эти конструкторы, я не получаю вектор v1 или вектор v9. Мне нужно создать эти v1 и v9 в качестве векторов. – erenkabakci

1

Прежде всего, код, который вы вывесили не может скомпилировать из-за эту линию:

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

вы должны увидеть эту ошибку:

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> >’ 

, потому что вы вносите все зЬе имена над объявление шаблона класса, которое делает видимым имя «вектор», а затем вы используете его для объявления объекта. Это похоже на запись «double double».

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

Если это то, что вы хотите, вот код, который делает это:

#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; 
} 

Если вы заинтересованы в арифметических операциях над векторами, которые отличаются от алгоритмов, определенных в STL (накапливается, и т. д.), вместо того, чтобы концентрироваться на векторном классе и добавлять функции-члены, вы можете рассмотреть возможность создания генерических алгоритмов для векторов, которые ожидают определенные векторные концепции вместо этого. Тогда вам вообще не нужно думать о наследовании, и ваши общие алгоритмы могут работать с различными концепциями вектора.

Смежные вопросы