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

Реализовать пользовательский класс "Математический вектор"

10.01.2017, 12:34. Показов 6100. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно написать програму которая будет делать разные операции над векторами, используя операторы +,-,*
Я написал, но оно кричит что так нельзя. Подскажите илии наведите пример как правильно сделать
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
//1
struct vector  operator+(struct vector* a, struct vector* b)
{
    struct vector result;
    result.x = a->x + b->x;
    result.y = a->y + b->y;
    return result;
}
 
//2
struct vector  operator-(struct vector* a, struct vector* b)
{
    struct vector result;
    result.x = a->x - b->x;
    result.y = a->y - b->y;
    return result;
}
 
//3
struct vector  operator*(struct vector* a, int number)
{
    struct vector result;
    result.x = a->x * number;
    result.y = a->y * number;
    return result;
}
Добавлено через 43 минуты
Переделал:
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
struct vector  operator+(const struct vector& a)
{
    struct vector value;
    value.x += a.x;
    value.y += a.y;
    return value;
}
 
 
 
//2
struct vector  operator-(const struct vector& a)
{
    struct vector value;
    value.x -= a.x;
    value.y -= a.y;
    return value;
}
//3
struct vector  operator*(int number)
{
    struct vector value;
    value.x *= number;
    value.y *= number;
    return value;
}
но теперь не знаю как выводить на екран

Добавлено через 36 минут
переделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Vector2f
{
   Vector2f(float mX, float mY)
   {
       mX = 0.0;
       mY = 0.0;
   }
 
};
 
//1
const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(mX, mY);
    vec.mX = vec1.mX +  vec2.mX;
    vec.mY = vec1.mY +  vec2.mY;
    return vec;
}
 
Но еще  больше ошибок
Модераторы, вы только изменяете мои названия, а чтобы помочь так не помагаете
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2017, 12:34
Ответы с готовыми решениями:

Реализовать пользовательский класс комплексных чисел
Помогите пожалуйста сделать задание - программу вычисления комплексного числа. Есть рабочая, которая считает формулу:...

Реализовать пользовательский класс "Двунаправленный список"; реализовать добавление и удаление элементов
Записи в линейном списке содержат ключевое поле типа *char(строка символов). Сформировать двунаправленный список. Удалить К элементов с...

Реализовать произвольный пользовательский класс с функциями-членами Put и Show
Создать несколько обьектов. Написать функции: 1) для ввода данных по обьекту(как Put) 2) для распечатки информации об обьекте (как...

19
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.01.2017, 13:36

Не по теме:

Цитата Сообщение от olegmalahov Посмотреть сообщение
Модераторы, вы только изменяете мои названия, а чтобы помочь так не помагаете
Кто-то клялся Вам в вечной преданности? Или модераторы форума внезапно стали Вашими наёмными работниками?



По теме:
Функции-члены перенесите внутрь класса:
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
class Vector2f
{
private:
    double mX_;
    double mY_;
 
public:
    Vector2f()
    {
        mX_ = 0;
        mY_ = 0;   
    }
    
    Vector2f( double mX = 0, double mY = 0 )
    {
        mX_ = mX;
        mY_ = mY;   
    }
 
    //1
    const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2)
    {
        Vector2f vec(mX, mY);
        vec.mX = vec1.mX +  vec2.mX;
        vec.mY = vec1.mY +  vec2.mY;
        return vec;
    }
};
Добавлено через 3 минуты
Цитата Сообщение от olegmalahov Посмотреть сообщение
не знаю как выводить на екран
Создайте функцию-член show(). Либо перегрузите оператор <<.

olegmalahov, покажите, как бы Вы сделали вывод в функции main(), без классов (чтобы мне понимать, что именно выводится должно).
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
10.01.2017, 14:03  [ТС]

Не по теме:

Сорян, не хотел никого обидеть, мир:)


Мой весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef VECTOR2F_H
#define VECTOR2F_H
 
class Vector2f
{
public:
   Vector2f(float x, float y);
   const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2);
   const Vector2f operator-(const Vector2f& vec1, const Vector2f& vec2);
   const Vector2f operator*(const Vector2f& vec1, int number);
   long length(Vector2f*  vec);
   const Vector2f  scale(const Vector2f& vec1, const Vector2f& vec2);
    ~Vector2f();
 
private:
   float mX;
   float mY;
 
 
};
#endif // VECTOR2F_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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <QCoreApplication>
#include <iostream>
#include <Vector2f.h>
 
 
Vector2f::Vector2f(float x, float y)
    : mX(x)
    , mY(y)
{
 
}
 
 
//1
const Vector2f Vector2f::operator+(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX +  vec2.mX;
    mY = vec1.mY +  vec2.mY;
    return vec;
}
 
//2
const Vector2f Vector2f::operator-(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX - vec2.mX;
    mY = vec1.mY - vec2.mY;
    return vec;
}
//3
const Vector2f Vector2f::operator*(const Vector2f& vec1, int number)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX * number;
    mY = vec1.mY* number;
    return vec;
}
 
 
//5
long Vector2f::length(Vector2f*  vec)
{
    long result = sqrtl(powl(vec->mX, 2) + powl(vec->mY, 2));
    return result;
}
 
 
//6
const Vector2f  Vector2f::scale(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX * vec2.mX;
    mY = vec1.mY * vec2.mY;
    return vec;
}
 
 
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    Vector2f a = { 3.0f, 5.0f };
    Vector2f b = { 2.3f, 3.6f };
 
 
 
   //a = operator+(&b);
   //std::cout << "" << a.x << "," <<  a.y << ")";
 
 
    return app.exec();
}
Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    Vector2f a = { 3.0f, 5.0f };
    Vector2f b = { 2.3f, 3.6f };
    Vector2f c;
 
 
 
   c = operator+(&a, &b);
   std::cout << "" << c.mX << "," <<  c.mY << ")";
 
 
    return app.exec();
}
Добавлено через 6 минут
новое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef VECTOR2F_H
#define VECTOR2F_H
 
class Vector2f
{
public:
   Vector2f();
   Vector2f(float x = 0.0f, float y = 0.0f);
   const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2);
   const Vector2f operator-(const Vector2f& vec1, const Vector2f& vec2);
   const Vector2f operator*(const Vector2f& vec1, int number);
   long length(Vector2f*  vec);
   const Vector2f  scale(const Vector2f& vec1, const Vector2f& vec2);
    ~Vector2f();
 
private:
   float mX;
   float mY;
 
 
};
#endif // VECTOR2F_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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <QCoreApplication>
#include <iostream>
#include <Vector2f.h>
 
Vector2f::Vector2f()
{
    mX = 0.0f;
    mY = 0.0f;
}
 
Vector2f::Vector2f(float x = 0.0f, float y = 0.0f)
    : mX(x)
    , mY(y)
{
 
}
 
 
//1
const Vector2f Vector2f::operator+(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX +  vec2.mX;
    mY = vec1.mY +  vec2.mY;
    return vec;
}
 
//2
const Vector2f Vector2f::operator-(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX - vec2.mX;
    mY = vec1.mY - vec2.mY;
    return vec;
}
//3
const Vector2f Vector2f::operator*(const Vector2f& vec1, int number)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX * number;
    mY = vec1.mY* number;
    return vec;
}
 
 
//5
long Vector2f::length(Vector2f*  vec)
{
    long result = sqrtl(powl(vec->mX, 2) + powl(vec->mY, 2));
    return result;
}
 
 
//6
const Vector2f  Vector2f::scale(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX * vec2.mX;
    mY = vec1.mY * vec2.mY;
    return vec;
}
 
 
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    Vector2f a = { 3.0f, 5.0f };
    Vector2f b = { 2.3f, 3.6f };
    Vector2f c;
 
 
 
   c = operator+(&a, &b);
   std::cout << "" << c.mX << "," <<  c.mY << ")";
 
 
    return app.exec();
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.01.2017, 14:30
olegmalahov, вот:

Vector2f.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
26
27
28
#ifndef VECTOR2F_H
#define VECTOR2F_H
 
#include <iostream>
 
class Vector2f
{
public:
    Vector2f();
    Vector2f(float x, float y);
 
    Vector2f operator+(const Vector2f& vec) const;
    Vector2f operator-(const Vector2f& vec) const;
    Vector2f operator*(int number) const;
 
    double length(Vector2f*  vec);
    Vector2f scale(const Vector2f& vec1, const Vector2f& vec2);
 
    friend std::ostream& operator <<(std::ostream& os, const Vector2f& vec);
 
private:
    float mX;
    float mY;
 
 
};
 
#endif // VECTOR2F_H

Vector2f.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "Vector2f.h"
#include <cmath>
 
Vector2f::Vector2f()
    :
        mX(0),
        mY(0)
{}
 
Vector2f::Vector2f(float x, float y)
    :
        mX(x),
        mY(y)
{}
 
//1
Vector2f Vector2f::operator+(const Vector2f& vec) const
{
    Vector2f sum;
    sum.mX = mX + vec.mX;
    sum.mY = mY + vec.mY;
    return sum;
}
 
//2
Vector2f Vector2f::operator-(const Vector2f& vec) const
{
    Vector2f diff;
    diff.mX = mX + vec.mX;
    diff.mY = mY + vec.mY;
    return diff;
}
//3
Vector2f Vector2f::operator*(int number) const
{
    Vector2f result;
    result.mX *= number;
    result.mY *= number;
    return result;
}
 
 
//5
double Vector2f::length(Vector2f*  vec)
{
    double result =
        std::sqrt(std::pow(vec->mX, 2) + std::pow(vec->mY, 2));
    return result;
}
 
 
//6
Vector2f Vector2f::scale(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(vec1.mX * vec2.mX, vec1.mY * vec2.mY);
    return vec;
}
 
std::ostream& operator <<( std::ostream & os, const Vector2f& vec)
{
    os << vec.mX << ", " <<  vec.mY << "\n\n";
    return os;
}

main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
#include "Vector2f.h"
 
int main()
{
    Vector2f a(3.0f, 5.0f);
    Vector2f b(2.3f, 3.6f);
 
    std::cout << a << b;
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
10.01.2017, 14:31  [ТС]
новое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef VECTOR2F_H
#define VECTOR2F_H
 
class Vector2f
{
public:
   Vector2f();
   Vector2f(float x = 0.0f, float y = 0.0f);
   const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2);
   const Vector2f operator-(const Vector2f& vec1, const Vector2f& vec2);
   const Vector2f operator*(const Vector2f& vec1, int number);
   long length(Vector2f*  vec);
   const Vector2f  scale(const Vector2f& vec1, const Vector2f& vec2);
    ~Vector2f();
 
private:
   float mX;
   float mY;
 
 
};
#endif // VECTOR2F_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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <QCoreApplication>
#include <iostream>
#include <Vector2f.h>
 
Vector2f::Vector2f()
{
    mX = 0.0f;
    mY = 0.0f;
}
 
Vector2f::Vector2f(float x = 0.0f, float y = 0.0f)
    : mX(x)
    , mY(y)
{
 
}
 
 
//1
const Vector2f Vector2f::operator+(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX +  vec2.mX;
    mY = vec1.mY +  vec2.mY;
    return vec;
}
 
//2
const Vector2f Vector2f::operator-(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX - vec2.mX;
    mY = vec1.mY - vec2.mY;
    return vec;
}
//3
const Vector2f Vector2f::operator*(const Vector2f& vec1, int number)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX * number;
    mY = vec1.mY* number;
    return vec;
}
 
 
//5
long Vector2f::length(Vector2f*  vec)
{
    long result = sqrtl(powl(vec->mX, 2) + powl(vec->mY, 2));
    return result;
}
 
 
//6
const Vector2f  Vector2f::scale(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(float mX, float mY);
    mX = vec1.mX * vec2.mX;
    mY = vec1.mY * vec2.mY;
    return vec;
}
 
 
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    Vector2f a = { 3.0f, 5.0f };
    Vector2f b = { 2.3f, 3.6f };
    Vector2f c;
 
 
 
   c = operator+(&a, &b);
   std::cout << "" << c.mX << "," <<  c.mY << ")";
 
 
    return app.exec();
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.01.2017, 14:32
olegmalahov, чтобы присваивать один вектор другому, надо сделать конструктор копирования и перегрузить операцию присваивания.
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
10.01.2017, 14:34  [ТС]
gru74ik, операторы +,-,* я сам делаю, не стандартные, то есть + - добуток простой, - - разница, и * умножение на значения
я просто так назвал функции оператор +, -, *
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.01.2017, 14:45
Цитата Сообщение от gru74ik Посмотреть сообщение
сделать конструктор копирования и перегрузить операцию присваивания
Вот:

Vector2f.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
26
27
28
29
#ifndef VECTOR2F_H
#define VECTOR2F_H
 
#include <iostream>
 
class Vector2f
{
public:
    Vector2f();
    Vector2f(float x, float y);
    Vector2f(const Vector2f& vec);
 
    Vector2f operator+(const Vector2f& vec) const;
    Vector2f operator-(const Vector2f& vec) const;
    Vector2f operator*(int number) const;
    Vector2f operator=(const Vector2f& vec);
    double length(Vector2f*  vec);
    Vector2f scale(const Vector2f& vec1, const Vector2f& vec2);
 
    friend std::ostream& operator <<(std::ostream& os, const Vector2f& vec);
 
private:
    float mX;
    float mY;
 
 
};
 
#endif // VECTOR2F_H

Vector2f.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "Vector2f.h"
#include <cmath>
 
Vector2f::Vector2f()
    :
        mX(0),
        mY(0)
{}
 
Vector2f::Vector2f(float x, float y)
    :
        mX(x),
        mY(y)
{}
 
Vector2f::Vector2f(const Vector2f& vec)
{
    mX = vec.mX;
    mY = vec.mY;
}
 
//1
Vector2f Vector2f::operator+(const Vector2f& vec) const
{
    Vector2f sum;
    sum.mX = mX + vec.mX;
    sum.mY = mY + vec.mY;
    return sum;
}
 
//2
Vector2f Vector2f::operator-(const Vector2f& vec) const
{
    Vector2f diff;
    diff.mX = mX + vec.mX;
    diff.mY = mY + vec.mY;
    return diff;
}
//3
Vector2f Vector2f::operator*(int number) const
{
    Vector2f result;
    result.mX *= number;
    result.mY *= number;
    return result;
}
//4
Vector2f Vector2f::operator=(const Vector2f& vec)
{
    if ( this != &vec)
    {
        mX = vec.mX;
        mY = vec.mY;
    }
    return *this;
}
 
//5
double Vector2f::length(Vector2f*  vec)
{
    double result =
        std::sqrt(std::pow(vec->mX, 2) + std::pow(vec->mY, 2));
    return result;
}
 
 
//6
Vector2f Vector2f::scale(const Vector2f& vec1, const Vector2f& vec2)
{
    Vector2f vec(vec1.mX * vec2.mX, vec1.mY * vec2.mY);
    return vec;
}
 
std::ostream& operator <<( std::ostream & os, const Vector2f& vec)
{
    os << vec.mX << ", " <<  vec.mY << "\n\n";
    return os;
}

main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Vector2f.h"
 
int main()
{
    Vector2f a(3.0f, 5.0f);
    Vector2f b(2.3f, 3.6f);
 
    std::cout << a << b;
 
    Vector2f c;
    c = b;
 
    Vector2f d(a);
 
    std::cout << c << d;
 
    return 0;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.01.2017, 14:48
Цитата Сообщение от olegmalahov Посмотреть сообщение
я просто так назвал функции оператор +, -, *
olegmalahov, так делать нельзя. Компилятор воспринимает такие названия как попытку перегрузки стандартных уже встроенных в язык операторов. Поэтому, либо назовите функции иначе, либо перегружайте операторы как положено.
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
10.01.2017, 16:55  [ТС]
gru74ik, препод сказал так сделать - назвать, я спросил его еще раз, он сказал что эти функции должны быть не внутри класу. И что два аргумента должно быть а не один

Добавлено через 1 час 46 минут
gru74ik,
теперь только выводить на екран нужно исправить, а то выдает ошибку:
main.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl Vector2f::~Vector2f(void)" (??1Vector2f@@QEAA@XZ) referenced in function main
debug\VectorMatchConsole.exe:-1: error: LNK1120: 1 unresolved externals
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef VECTOR2F_H
#define VECTOR2F_H
 
struct Vector2f
{
   Vector2f();
   Vector2f(float x, float y);
    ~Vector2f();
   float mX,mY;
};
#endif // VECTOR2F_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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <Vector2f.h>
#include <cmath>
#include <iostream>
 
Vector2f::Vector2f()
    : mX(0.0f)
    , mY(0.0f)
{
}
 
Vector2f::Vector2f(float x, float y)
    : mX(x)
    , mY(y)
{
 
}
 
 
//1
const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2)
{
    return Vector2f(vec1.mX + vec2.mX, vec1.mY + vec2.mY);
}
 
//2
const Vector2f operator-(const Vector2f& vec1, const Vector2f& vec2)
{
    return Vector2f(vec1.mX - vec2.mX, vec1.mY - vec2.mY);
}
//3
const Vector2f operator*(const Vector2f& vec1, int number)
{
    return Vector2f(vec1.mX * number, vec1.mY * number);
}
 
//5
float length(Vector2f*  vec)
{
    float result = sqrtl(powl(vec->mX, 2) + powl(vec->mY, 2));
    return result;
}
 
 
//6
const Vector2f  scale(const Vector2f& vec1, const Vector2f& vec2)
{
    return Vector2f(vec1.mX * vec2.mX, vec1.mY * vec2.mY);
}
 
std::ostream& operator <<( std::ostream & os, const Vector2f& vec)
{
    os << vec.mX << ", " <<  vec.mY << "\n\n";
    return os;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QCoreApplication>
#include <iostream>
#include "Vector2f.cpp"
 
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    Vector2f a(3.0f, 5.0f);
    Vector2f b(2.3f, 3.6f);
 
    std::cout << a << b;
    return app.exec();
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.01.2017, 20:07
olegmalahov, Вы сами-то понимаете, что делаете? Учебник читали? У Вас реализация дружественной функции в source-файле (который Vector2f.cpp) имеется, а её объявление в заголовочнике (который Vector2f.h) где?

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Заголовочный файл Vector2f.h
#ifndef VECTOR2F_H
#define VECTOR2F_H
 
struct Vector2f
{
   Vector2f();
   Vector2f(float x, float y);
    ~Vector2f();
   float mX,mY;
 
    // объявление дружественной функции (перегруженный оператор вывода):
    friend std::ostream& operator <<(std::ostream& os, const Vector2f& vec);
};
#endif // VECTOR2F_H
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
10.01.2017, 21:00  [ТС]
gru74ik,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef VECTOR2F_H
#define VECTOR2F_H
#include <iostream>
struct Vector2f
{
   Vector2f();
   Vector2f(float x, float y);
    ~Vector2f();
   float mX,mY;
 
   friend std::ostream& operator <<(std::ostream& os, const Vector2f& vec);
 
};
#endif // VECTOR2F_H
ошибка таже
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.01.2017, 21:12
olegmalahov, ошибки у Вас от того, что Вы шаманством занимаетесь "вот это туда переставлю, авось поможет. Ан нет, не помогло. Тогда вот эту штучку (не знаю зачем она, но пусть будет), сюда засуну. Эээээ... ннннет. Не то, не работает. А дай-ка вот ещё вот эту загогулину сюдой впихну. О, другие ошибки начало выдавать. Прогресс!".

Начните думать.

Добавлено через 1 минуту
И книжки правильные читайте.

Добавлено через 1 минуту
olegmalahov, последний раз подсказываю: объявления всех функций должны быть в заголовочном файле. В source-файле должны быть все определения функций.
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
11.01.2017, 12:24  [ТС]
gru74ik, cпасибо, я тупанул и не внимательно прочитал ваш пост:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef VECTOR2F_H
#define VECTOR2F_H
#include <iostream>
struct Vector2f
{
   Vector2f();
   Vector2f(float x, float y);
    ~Vector2f();
   float mX,mY;
 
   friend std::ostream& operator <<(std::ostream& os, const Vector2f& vec);
 
};
const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2);
const Vector2f operator-(const Vector2f& vec1, const Vector2f& vec2);
const Vector2f operator*(const Vector2f& vec1, int number);
Vector2f normalize(Vector2f*  vec);
float length(Vector2f*  vec);
const Vector2f  scale(const Vector2f& vec1, const Vector2f& vec2);
 
#endif // VECTOR2F_H
Добавлено через 14 часов 51 минуту
gru74ik, хоть убейте, прочитал в инете, все так как у меня. Но почему оно выдает ошибку после того как я додаю в меин вывод на екран. Это не кидок в небо, я честно разобрался и смотрел почему оно не работает с самого утра, но так и не понял что не так
выдает ошибку:
error: C2039: '<<': is not a member of 'Vector2f'
Добавлено через 5 минут
C++
1
2
3
4
5
std::ostream& Vector2f::operator <<( std::ostream & os, const Vector2f& vec)
{
    os << vec.mX << ", " <<  vec.mY << "\n\n";
    return os;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.01.2017, 13:11
olegmalahov, давайте будем действовать по такому алгоритму:
  1. Вы выкладываете все три файла (не два, не один, а все три) в том состоянии, в каком они у Вас имеются на текущий момент
  2. Вы выкладываете скриншот ошибок
  3. я указываю Вам на проблему
  4. Вы вносите все исправления, на которые я указал
  5. если результат неудовлетворительный, Вы повторяете цикл, начиная с пункта #1
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.01.2017, 13:21
olegmalahov, ах да. Судя по Вашему коду, Вы работаете в QtCreator. Так вот, мне непонятно зачем Вы создали приложение с Qt.
Создайте новый проект. При выборе вида проекта выбирайте "Консольное приложение". Затем добавьте к проекту новый класс. Скопируйте в файлы Ваш код. Попробуйте скомпилировать программу.
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
11.01.2017, 17:14  [ТС]
gru74ik, так я и создавал консоль апрликейшн
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef VECTOR2F_H
#define VECTOR2F_H
#include <iostream>
struct Vector2f
{
   Vector2f();
   Vector2f(float x, float y);
    ~Vector2f();
   float mX,mY;
   friend std::ostream& operator <<(std::ostream& os, const Vector2f& vec);
};
const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2);
const Vector2f operator-(const Vector2f& vec1, const Vector2f& vec2);
const Vector2f operator*(const Vector2f& vec1, int number);
float normalize(Vector2f*  vec);
float length(Vector2f*  vec);
const Vector2f  scale(const Vector2f& vec1, const Vector2f& vec2);
 
#endif // VECTOR2F_H
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QCoreApplication>
#include <iostream>
#include "Vector2f.cpp"
 
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    Vector2f a(3.0f, 5.0f);
    Vector2f b(2.3f, 3.6f);
 
    std::cout << a << b;
    return app.exec();
}
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "Vector2f.h"
#include <cmath>
#include <iostream>
 
Vector2f::Vector2f()
    : mX(0.0f)
    , mY(0.0f)
{
}
 
Vector2f::Vector2f(float x, float y)
    : mX(x)
    , mY(y)
{
 
}
 
 
//1
const Vector2f operator+(const Vector2f& vec1, const Vector2f& vec2)
{
    return Vector2f(vec1.mX + vec2.mX, vec1.mY + vec2.mY);
}
 
//2
const Vector2f operator-(const Vector2f& vec1, const Vector2f& vec2)
{
    return Vector2f(vec1.mX - vec2.mX, vec1.mY - vec2.mY);
}
//3
const Vector2f operator*(const Vector2f& vec1, int number)
{
    return Vector2f(vec1.mX * number, vec1.mY * number);
}
 
//4
float normalize(Vector2f*  vec)
{
    float inv_length = 1.0f / std::sqrt(std::pow(vec->mX, 2) + std::pow(vec->mY, 2));
    return inv_length;
}
 
//5
float length(Vector2f*  vec)
{
    return float(std::sqrt(std::pow(vec->mX, 2) + std::pow(vec->mY, 2)));
}
 
 
//6
const Vector2f  scale(const Vector2f& vec1, const Vector2f& vec2)
{
    return Vector2f(vec1.mX * vec2.mX, vec1.mY * vec2.mY);
}
 
std::ostream& operator <<( std::ostream & os, const Vector2f& vec)
{
    os << vec.mX << ", " <<  vec.mY << "\n\n";
    return os;
}
 
Vector2f::~Vector2f()
{
}
ошибка: \Qt\build-VectorMatchConsole-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\debug\VectorMatchConsole.exe crashed.
В вижуал студии все работает

Добавлено через 14 минут
все работает и в qt
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.01.2017, 17:58
olegmalahov, создайте консольное приложение без Qt.
.
.

Добавлено через 7 минут
Цитата Сообщение от olegmalahov Посмотреть сообщение
все работает и в qt
Ваш код всё-таки заработал? Но в функции main() у Вас только создание двух объектов и их вывод на экран. Хотелось бы увидеть примеры работы созданных Вами функций.
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
11.01.2017, 18:26  [ТС]
Посмотрите, я делаю нормализацию , и оно кричит в двох местах, что я не так делаю:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
float normalize(Vector2f*  vec)
{
    float len = length(vec);
    if (len == 0)
    {
        return 0;
    }
    else
    {
        return Vector2f ((vec->mX / length(vec->mX)),  vec->mY / length(vec->mY));
    }
 
}
но как тут правильно написать чтобы не было ошибки?
return Vector2f ((vec->mX / length(vec->mX)), vec->mY / length(vec->mY));
и тут
Vector2f vec1(3.0f, 5.0f);
Vector2f norm;
norm = normalize(vec1);
Добавлено через 42 секунды
gru74ik, main
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
#include "Vector2f.h"
 
int main()
{
    Vector2f vec1(3.0f, 5.0f);
    Vector2f vec2(2.3f, 3.6f);
 
    std::cout << "vec1: " << vec1 << std::endl;
    std::cout << "vec2: " << vec2 << std::endl;
 
    Vector2f op1;
    Vector2f op2;
    Vector2f op3;
    float len;
    float norm;
    Vector2f sc;
    Vector2f perV;
 
    int number = 2;
    op1 = operator-(vec1, vec2);
    op2 = operator-(vec1, vec2);
    op3 = operator*(vec1, number);
 
    len = length(&vec1);
    norm = normalize(&vec1);
    sc = scale(vec1, vec2);
    perV = perVector(vec1);
 
    std::cout << "Operator+: " << op1 << std::endl;
    std::cout << "Operator-: " << op2 << std::endl;
    std::cout << "Operator*: " << op2 << std::endl;
    std::cout << "Length: "<< len << std::endl;
    std::cout << "Normalize: " << norm << std::endl;
    std::cout << "Scale: " << sc << std::endl;
    std::cout << "PerVector: " << perV << std::endl;
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 56
11.01.2017, 18:27  [ТС]
как видим только функция нормализации не правильно работает, поэтому я и ее переделываю
Раньше у меня этот код был:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
float normalize(Vector2f*  vec)
{
    float len = length(vec);
    if (len == 0)
    {
        return 0;
    }
    else
    {
        float invLength = 1.0f / length(vec);
        return invLength;
    }
 
}
Миниатюры
Реализовать пользовательский класс "Математический вектор"  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2017, 18:27
Помогаю со студенческими работами здесь

Пользовательский класс String: реализовать копирование строки и вывод её на консоль (найти ошибки в коде)
Привет. Мне нужен ответ: я дурак, или это c++ подвел (естественно первое:)). Я решил попрактиковаться и написать собственный класс string,...

Реализовать пользовательский класс Matrix (найти причины возникновения ошибок в коде и исправить эти ошибки)
Доброго времени суток,задание написать класс Matrix,все вроде бы понятно,но почему-то моя матрица инициализируется мусором,не знаю почему,и...

Реализовать класс вектор
Здравствуйте, помогите с последним пунктом задачи: Реализовать класс вектор, содержащий следующие поля: координаты вектора; ...

Реализовать класс вектор
Здравствуйте, помогите с пунктом задачи: Реализовать класс вектор(двумерный), содержащий следующие поля: координаты вектора; ...

Реализовать пользовательский класс "Связанный список" (не понимаю код)
Всем привет , может кто рассказать конкретно что происходит в тех строках где стоят комментарии. Вывожу числа от 0 до 9. Заранее...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
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 позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru