Вступление:
Извините, если название немного запутанное или расплывчатое. Мне было очень трудно выполнить поиск по моей проблеме в Интернете, потому что мой вопрос, похоже, не разбит на поисковые термины. Кроме того, это мой первый пост в Stackoverflow, если я выйду за рамки традиционного подхода к отправке вопросов, пожалуйста, потерпите меня, я сделаю все возможное, чтобы форматирование было разумным.
С учетом сказанного, позвольте мне перейти к тому, что я пытаюсь сделать:
Я учусь в колледже и работаю по заданию, данному инструктором. Мы создаем класс для векторов (то есть векторов с точки зрения математики, а не вектора типа данных). Этот класс должен быть шаблоном класса, двумя различными типами шаблонных данных, один для компонента x вектора, а другой для компонента y вектора. Это простой класс, класс возвращает величину и направление (в радианах) вектора. Есть также перегруженные операторы ввода и вывода в качестве дружественных функций и пара конструкторов. Я не работаю с динамической памятью, так что мы можем отложить всю эту банку с червями в сторону.
Вот проблема, которую я имею:
Vector2D<int, int> vec1(); //Default Constructor
cin >> vec1;
cout << "\nVector 1 = " << vec1 << "\n\tDirection: " << vec1.direction()
<< "\tMagnitude: " << vec1.magnitude() << "\n\n";
Моя проблема в том, что я не могу сделать cin, и я не могу вывести direction () и magnitude (). Компилятор выдает мне очень длинную ошибку, но в основном говорит
ошибка C2678: двоичный файл «>>»: не найден оператор, который принимает левый операнд типа «std :: istream» (или нет приемлемого преобразования)
Если, однако, я делаю это:
Vector2D<int, int> vec1(0,0); //No longer the default constructor
cin >> vec1;
cout << "\nVector 1 = " << vec1 << "\n\tDirection: " << vec1.direction()
<< "\tMagnitude: " << vec1.magnitude() << "\n\n";
Все довольны миром. Поэтому мой вопрос просто, как мне это исправить? Я хотел бы использовать cin после создания экземпляра с помощью конструктора по умолчанию, и я хотел бы вывести direction () и magnitude (). Представьте, что я правильно сделал все объявления заголовков и все остальное, и то, как я написал мой класс, неверно — вот оно:
Мой файл класса:
#pragma once
#include <iostream>
#include <iomanip>
#include <cmath> //for sqrt function to get the magnitude and atan for radians.
using namespace std;
template <class T, class S>
class Vector2D
{
private:
T m_xComp;
S m_yComp;
static int signif_digit; //Becomes the argument for setPrecision(x) on output.
public:
static int signif_digits;
Vector2D(): m_xComp((T)0), (S)m_yComp((S)0) {};
Vector2D(T xComp, S yComp);
void setX(T xComp);
void setY(S yComp);
T getX();
S getY();
double magnitude();
double direction(); //returns direction of vector in radians.
static void setPrecision(int prec);
static int precision();
friend ostream& operator<<(ostream& os, const Vector2D<T,S>& vec)
{ //A good thing to figure out: Why did I have to declare friend functions in line?
os << '<' << vec.m_xComp << ',' << vec.m_yComp << '>';
return os;
}
friend istream& operator>>(istream& is, Vector2D<T,S>& vec)
{ //A good thing to figure out: Why did I have to declare friend functions in line?
char remove_Char;
T xComp = 0;
S yComp = 0;
is >> remove_Char >> xComp >> remove_Char >> yComp;
vec.m_xComp = xComp;
vec.m_yComp = yComp;
return is;
}
};template <class T, class S>
Vector2D<T, S>::Vector2D(T xComp, S yComp)
{
m_xComp = xComp;
m_yComp = yComp;
}template <class T, class S>
void Vector2D<T, S>::setPrecision(int prec)
{
signif_digit = prec;
}template <class T, class S>
int Vector2D<T, S>::precision()
{ return signif_digit; }template <class T, class S>
void Vector2D<T, S>::setX(T xComp)
{ m_xComp = xComp; }template <class T, class S>
void Vector2D<T, S>::setY(S yComp)
{ m_yComp = yComp; }template <class T, class S>
T Vector2D<T, S>::getX()
{ return m_xComp; }template <class T, class S>
S Vector2D<T, S>::getY()
{ return m_yComp; }template <class T, class S>
double Vector2D<T, S>::magnitude()
{
return sqrt( (double)(m_xComp*m_xComp + m_yComp*m_yComp) );
}//------------------------Consider using atan2 next time-------------------------------------
template <class T, class S>
double Vector2D<T, S>::direction()
{
if (m_xComp == 0)
{
if(m_yComp == 0)
{
cout << "\nNote: Both x and y components equal zero.\n";
return 0;
}
else if (m_yComp > 0)
return atan(1.0)*2; //If y > 0 and x = 0, return PI/2
else if (m_yComp < 0)
return atan(1.0)*6; //If y < 0 and x = 0, return 3*PI/2
}
else if (m_xComp > 0)
{
if (m_yComp >= 0)
return atan((double)(m_yComp/m_xComp)); //First Quadrant
else
return (atan(1.0)*8 + atan((double)(m_yComp/m_xComp)) ); //Fourth Quadrant
}
else
return (atan(1.0)*4 + atan((double)(m_yComp/m_xComp)) ); //Second & Third Quadrant
}
//-------------------------------------------------------------------------------------------template <class T, class S>
int Vector2D<T, S>::signif_digit = 3; //private
template <class T, class S>
int Vector2D<T, S>::signif_digits = 3; //public
Это все. Пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация, которую я должен включить.
Благодарю.
В комментариях дип отвечает на мой вопрос. Это было так просто. Просто я пытался создать экземпляр класса MyVector, как будто я объявлял функцию.
Этот код:
Vector2D<int, int> vec1();
Должно было:
Vector2D<int, int> vec1;
Легко, как торт. Еще раз спасибо, дип.
Других решений пока нет …