Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2017, 11:11   #1
vovamakr
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 41
По умолчанию Реализовать пользовательский класс "Математический вектор"

Добрый день. Реализовал некоторые операции над вектором математическим. Но не работает функция вывода на екран оператор <<.
Посмотрите в чем может быть проблема, и правильно ли я реализовал другие операции. Операторы +,-,* это просто добуток, разница, и умножение.
Код:
#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
Код:
#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 / sqrtl(powl(vec->mX, 2) + powl(vec->mY, 2));
    return inv_length;
}

//5
float length(Vector2f*  vec)
{
    return float(sqrtl(powl(vec->mX, 2) + powl(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& Vector2f::operator <<( std::ostream & os, const Vector2f& vec)
{
    os << vec.mX << ", " <<  vec.mY << "\n\n";
    return os;
}
Код:
#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();
}
ошибок нету, пока я не додаю в меин вывод на екран.
vovamakr вне форума Ответить с цитированием
Старый 11.01.2017, 12:21   #2
vovamakr
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 41
По умолчанию

Выдает ошибку:
Цитата:
error: C2039: '<<': is not a member of 'Vector2f'
vovamakr вне форума Ответить с цитированием
Старый 11.01.2017, 12:30   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
std::ostream& Vector2f::operator <<( std::ostream & os, const Vector2f& vec)
Она его друг, а не член... о чем вам и написали.
p51x вне форума Ответить с цитированием
Старый 11.01.2017, 13:03   #4
vovamakr
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 41
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
std::ostream& Vector2f::operator <<( std::ostream & os, const Vector2f& vec)
Она его друг, а не член... о чем вам и написали.
ок, убрал
Код:
std::ostream& operator <<( std::ostream & os, const Vector2f& vec)
{
    os << vec.mX << ", " <<  vec.mY << "\n\n";
    return os;
}
теперь другая ошибка:
Цитата:
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
vovamakr вне форума Ответить с цитированием
Старый 11.01.2017, 13:19   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну дык деструктор вы объявили, а реализовать забыли.
p51x вне форума Ответить с цитированием
Старый 11.01.2017, 13:32   #6
vovamakr
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 41
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну дык деструктор вы объявили, а реализовать забыли.
спасибо, а я думаю что не так
vovamakr вне форума Ответить с цитированием
Старый 11.01.2017, 13:52   #7
vovamakr
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 41
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну дык деструктор вы объявили, а реализовать забыли.
крешится(((
попробовал на qtcreatore тоже крошится
vovamakr вне форума Ответить с цитированием
Старый 11.01.2017, 13:54   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Смотрите в отладчике где и почему.
p51x вне форума Ответить с цитированием
Старый 11.01.2017, 14:25   #9
vovamakr
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 41
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Смотрите в отладчике где и почему.
нашел, посмотрите я правильно делаю нормализация и длину ищу вектора:
Код:
float normalize(Vector2f*  vec)
{
    float inv_length = 1.0f / sqrtl(powl(vec->mX, 2) + powl(vec->mY, 2));
    return inv_length;
}

//5
float length(Vector2f*  vec)
{
    return float(sqrtl(powl(vec->mX, 2) + powl(vec->mY, 2)));
}

Последний раз редактировалось vovamakr; 11.01.2017 в 14:28.
vovamakr вне форума Ответить с цитированием
Старый 11.01.2017, 14:29   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. Зачем вам эти powl, sqrtl, когда есть стандартные std:ow, std::sqrt ?
2. Вы так свободно делите... а если там 0 ?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" link90 Общие вопросы C/C++ 2 27.03.2016 12:34
Реализовать класс "Mагазин города" malikon C# (си шарп) 2 03.12.2014 17:24
Реализовать класс с именем "Stroki". Реализовать в нём возможность <Поиска и замены фрагмента> Olgazag C# (си шарп) 0 12.12.2013 11:09
Нужно разработать класс "вектор" и реализовать операцию векторного умножения векторов. (язык C) Кристина178012 Помощь студентам 0 17.09.2013 22:42
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40