Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 01.09.2016
Сообщений: 16

Перегрузка операторов в шаблонном классе

14.02.2020, 17:09. Показов 2797. Ответов 4

Студворк — интернет-сервис помощи студентам
Привет!

У меня есть шаблонный класс содержащий массив и его размер:
Vector.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
#ifndef Vector_H
#define Vector_H
 
template<class T>
class Vector
{
private:
    T* Vect;
 
public:
    int Length;
 
    Vector(void);
    Vector(T* array, int length);
 
    /* Перегрузка операторов */
    T& operator [] (const int index);
    const T& operator [] (const int index) const;
 
    ~Vector(void);
};
 
#include "Vector.cpp"
#endif // !Vector_H

Vector.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once
#ifndef Vector_cpp
#define Vector_cpp
 
#include "Vector.h"
#include <malloc.h>
 
template<class T>
Vector<T>::Vector()
{
    Vector<T>::Length = 0;
    Vector<T>::Vect = (T*)malloc(0 * sizeof(T));
}
 
template<class T>
Vector<T>::Vector(T* array, int length)
{
    Vector<T>::Vect = (T*)malloc(length * sizeof(T));
 
    for (int i = 0; i < length; i++)
        Vector<T>::Vect[i] = array[i];
 
    Vector<T>::Length = length;
}
 
template<class T>
T& Vector<T>::operator [] (const int index)
{
    return Vector<T>::Vect[index];
}
 
template<class T>
const T& Vector<T>::operator [] (const int index) const
{
    return Vector<T>::Vect[index];
}
 
template<class T>
Vector<T>::~Vector()
{
    free(Vector<T>::Vect);
}
#endif


С перегрузкой унарных операторов всё просто, но как реализовать бинарные операторы? Например умножение на число или сравнение двух объектов класса, что бы следующий код был валидным?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
int array1[4] = { 1, 2, 3, 4 };
Vector<int> vect1{array1, 4 };
 
float array2[4] = { 1.2, 2.3, 3.4, 4.5 };
Vector<float> vect2{array2, 4 };
 
if (vect1 == vect2)
    cout << "true";
else
    cout << "false";
 
Vector<float> vect3 = 4 * vect2;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2020, 17:09
Ответы с готовыми решениями:

Перегрузка операторов из дружеской функции в шаблонном классе
Скомпилировал http://dmtsoft.ru/bn/370/as/oneaticleshablon/. Как только перенёс в свой шаблонный класс почти весь этот исходник перестали...

перегрузка операторов ввода вывода в шаблонном классе
Здравствуйте, недавно начал изучать C++, так что не судите сильно за такой вопрос. Перегрузка операторов ввода вывода в шаблонном классе....

Перегрузка операторов ввода и вывода из потока в шаблонном классе
Доброго времени суток. Пишу свой вектор. В нём надо перегрузить вышеназванные операторы. Vector.h class Vector { // ... ...

4
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.02.2020, 17:14
Цитата Сообщение от Kober Посмотреть сообщение
if (vect1 == vect2)
а какя логика этого сравнения?
Цитата Сообщение от Kober Посмотреть сообщение
Vector<float> vect3 = 4 * vect2;
через static_cast<T>
а еще нужны operator= и конструктор копирования

Добавлено через 2 минуты
Цитата Сообщение от Kober Посмотреть сообщение
(T*)malloc(length * sizeof(T));
malloc не вызывает конструкторы
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.02.2020, 17:18
Лучший ответ Сообщение было отмечено Kober как решение

Решение

Цитата Сообщение от Kober Посмотреть сообщение
Например умножение на число или сравнение двух объектов класса, что бы следующий код был валидным?
Скотт Мэйерс Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Начни с 24 правила, потом переходи к 46 - му.
1
0 / 0 / 0
Регистрация: 01.09.2016
Сообщений: 16
14.02.2020, 17:34  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
а какя логика этого сравнения?
Например 1 == 1.0f

Цитата Сообщение от zayats80888 Посмотреть сообщение
через static_cast<T>
а еще нужны operator= и конструктор копирования
Не представляю как здесь использовать static_cast<>
C++
1
Vector<T> operator * (const T val, const  Vector<T> vect);
Кликните здесь для просмотра всего текста

Цитата Сообщение от _stanislav Посмотреть сообщение
Скотт Мэйерс Эффективное использование C++
Благодарю
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.02.2020, 17:39
Лучший ответ Сообщение было отмечено Kober как решение

Решение

Цитата Сообщение от Kober Посмотреть сообщение
Например 1 == 1.0f
Это не корректно. И какой тип к какому кастить?

Добавлено через 4 минуты
Цитата Сообщение от Kober Посмотреть сообщение
Не представляю как здесь использовать static_cast<>
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<class T> struct A
{
    T val;
    template<class U> A operator*(U rh)
    {
        return { static_cast<T>(rh) * val };
    }
};
 
#include <iostream>
 
int main()
{
    A<float> obj{ 2.3f };
    std::cout << (obj * 2).val;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2020, 17:39
Помогаю со студенческими работами здесь

Перегрузка оператора в шаблонном классе
Здравствуйте! Есть шаблонный класс Array, описывающий массив. Такая проблема: нужно перегрузить оператор &quot;&lt;&quot;, который...

Перегрузка дружественного оператора вывода в шаблонном классе
Здравствуйте! Я не могу понять как мне правильно сделать перегрузку оператора вывода ввывода в шаблонном классе ...

Перегрузка операторов в классе
Привет всем снова! Пожалуста помотрите на класс, представьте что все нужные заголовки включены. class Point { public: Point(void) :...

Перегрузка операторов в классе
Здравствуйте. Написал класс: template &lt;class T&gt; class LIST { private: T* listP; uint lSize; public:

Перегрузка операторов в классе
Создал класс ivl, нужно перегрузить операторы приведенные ниже и Dev C++ пишет, что &quot;ivl is not a type&quot;. Код прилагается. class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru