Вопрос шаблона C ++ - PullRequest
       20

Вопрос шаблона C ++

0 голосов
/ 07 марта 2011

я получил задание, в котором я должен написать класс для многомерного вектора

мне сказали, что я должен использовать шаблоны, что является совершенно новым для меня, а если быть точным, то я должен использовать template <unsigned short n>где n определяет, сколько измерений имеет мой вектор.

пока у меня есть это, но это не работает:

vector.h

#include <vector>

template <unsigned short n>
class Vector {
public:
    std::vector<float> coords;

    Vector<n>();

};

vector.cpp

 #include "vector.h"

 Vector<n>() {
 for(int i = 0; i < n; i++) {
     coords.push_back(0.0);
 }
};

мой конструктор по умолчанию делает векторные шнуры равными 0,0

я получаю ошибку на векторе.cpp C:\CodeBlocks\kool\praks3\vector.cpp|3|error: 'n' was not declared in this scope|

далее .. Почему я должен использовать шаблон здесь, я прочитал учебник по шаблону, и он используется для оптимизации кода и уменьшения повторения кода, но здесь n должно быть всегдаunsigned short

когда я смотрю этот пример, я понимаю, что использую шаблон, потому что моим типом данных может быть все, что я хочу, и я могу использовать его для чисел, двойных чисел или любых чисел

но в данный момент какой смысл использовать шаблон, когда я определил, какой тип данных я должен использовать ???

template <class dataType>
dataType GetMin (dataType a, dataType b) {
return ((a < b) ? a : b );
}

, если что-то неясно, не стесняйтесь спрашивать у меня!потому что есть много, что смущает меня:)

Ответы [ 3 ]

2 голосов
/ 07 марта 2011

Сначала вы должны внимательно прочитать шаблоны: http://www.cplusplus.com/doc/tutorial/templates/

Шаблоны хороши тем, что позволяют работать с универсальными типами.Например, получить максимум или минимум двух объектов (int, long, float и т. Д.), Используя один и тот же код.В вашем случае хорошей идеей является использование шаблонов, потому что это позволяет вам иметь векторы целых чисел, чисел с плавающей запятой, двойных чисел или чего угодно.

Другое дело, проще всего сохранить заголовок и реализацию в одном файле (заголовок) при использовании шаблонов.

Ваш конструктор, Vector<n>();, указан неверно.Поскольку у вашего класса template <unsigned short n> перед ним, все, что вы напишите в нем, будет с этим шаблоном.

template <unsigned short n>
class Vector {
public:
  // Here..    
};

Так что просто напишите ваш конструктор, как вы это обычно делаете.

2 голосов
/ 07 марта 2011

Вероятно, вам говорят, что здесь следует использовать шаблон не потому, что это правильно, а потому, что это, мы надеемся, научит вас, как его использовать.В частности, инструктор пытается показать вам, что шаблоны могут принимать определенные нетиповые параметры.

Ваши проблемы, тем не менее, имеют очень мало общего с шаблонами и не связаны с пониманием того, как создавать классы C ++.Когда вы определяете функцию в классе, вам нужно использовать синтаксис области действия:

// non-templated vector
Vector::Vector()
{
  ...
}

Это проблема 1. Проблема 2 заключается в том, что вы пытаетесь определить функциональность шаблона в файле cpp.Вы не можете сделать это.Вы должны поместить определения функций в заголовок (за исключением нескольких случаев, которые я дам вашему учителю позже).

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

std::vector<float> my_vect(42, 0.0); // builds a vector with 42 floats all initialized to 0.0

Используя эти подсказки, вы сможете решить свою домашнюю задачу.

1 голос
/ 07 марта 2011

Чтобы ответить: какой смысл использовать шаблон, когда я определил, какой тип данных я должен использовать ???

Нет смысла в вашем классе, как написано.Я бы ожидал увидеть оба типа для хранения и (возможно) размер в качестве параметров шаблона.

template <class T, unsigned short n>
class MyVector {
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...