LINUX.ORG.RU

я не понимаю зачем эти функции вообще было пихать в класс. Но раз уж запихнул, то они должны быть static.

Еще непонятно зачем размер массива передается в байтах.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

>я не понимаю зачем эти функции вообще было пихать в класс. Но раз уж запихнул, то они должны быть static.

Сделал. Thanks.

>Еще непонятно зачем размер массива передается в байтах.

Он передаётся для того, чтобы сосчитать кол-во элементов в массиве: int size = arraySize/sizeof(myArray[0]) - 1;

Есть какой-нибудь другой способ это узнать?

Selecter ★★★★
() автор топика
Ответ на: комментарий от Selecter

> Он передаётся для того, чтобы сосчитать кол-во элементов в массиве

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

кстати, по моему sizeof( T ) короче чем sizeof(myArray[0]).

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Да, ты прав. sizeof динамического массива будет всегда равен размеру его типа.

Так что лучше я буду передавать просто кол-во элементов.

Selecter ★★★★
() автор топика

Ээээ... я вообще не понял))))

Зачем вначале вешать объявление template <class T> void printVector(vector<T> &myVector); emplate <class T> void printArray(T *myArray, unsigned int arraySize); а потом определять их в классе??? Что то ту явно лишнее, либо то либо другое. Воообще, повторяюсь - методы в класс имеет смысл сгребать ежели к ним идут какие то специфические данные которые должны быть локализованы в классе. В данном же случае это должно быть в виде отдельных функций (занать их в класс никогда не поздно).

Для вектора в стиле Спп вообще надо определить template<class T> ostream& operator << (ostream&, vector<T>&){...} и вся любоВ.

С арраем хуже, тут оператором не обойдешься... но по большому счету он вообще нах не нужен, вывод и так занимает одну строку for(int i=0;i<size;i++) cout<<array[i]<<endl;

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

for(vector<T>::iterator I=myVector.begin();I!=myVector.end();I++) cout<<*I<<endl;

AIv ★★★★★
()

1. Using clause 'using namespace std' in header files is not appropriate. It brings in the whole namespace in. Either use the non-qualified names (cout,cin, etc.) and require the #including file to specify the namespace, or specify the namespace explicitly (std::cout, std::cin, etc.), or place specific 'using' clauses (using std::cout; using std::cin;). 

2. The top level template functions do not seem to have any meaning.

3. Comment /* Public functions */ just before pubic section decaration is silly.

4. Member functions printVector should receive the parameter by const reference and not by reference.

5. In fact, the first member function ("printVector") is not needed at all. Instead, std::copy should be used, e.g:

std::copy( myvec.begin(), myvec.end(),
    std::ostream_iterator<T>(cout, "\n")
);

where T is the relevant type. 

The only reason to wrap the call to copy is to deduce the type which is the value of T at compile time.

6. Likewise, the second member funciton ("printArray") is not needed as well.
Instead, std::copy should be used, e.g.

std::copy(
   &myArray[0],
   &myArray[0] + (sizeof myArray / sizeof myArray[0]),
   std::ostream_iterator<T>(cout, "\n")
) ;

where T is the relevant type.

As in the previous example, template wrappers may be used to deduce the value of T.

7. If these functions are to be wrapped into a helper template that will automatically deduce the value of T, then these are to be placed in their own namespace.

omerm
()
Ответ на: комментарий от omerm

> > кстати, по моему sizeof( T ) короче чем sizeof(myArray[0]).

> ??? Did not understand that. Can you elaborate?

I mean they are semantically equivalent but former is simpler.

dilmah ★★★★★
()
Ответ на: комментарий от AIv

поностью согласен с AIv. Итераторами надо пользоваться. Объявление шаблонных функций в классе - это как кобыле седло. Лишнее это все

sdr
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.