шаблоны — C ++: Как скомпоновать ввод в объект после создания экземпляра с конструктором по умолчанию, когда класс шаблонизируется

Вступление:

Извините, если название немного запутанное или расплывчатое. Мне было очень трудно выполнить поиск по моей проблеме в Интернете, потому что мой вопрос, похоже, не разбит на поисковые термины. Кроме того, это мой первый пост в 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

Это все. Пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация, которую я должен включить.

Благодарю.

2

Решение

В комментариях дип отвечает на мой вопрос. Это было так просто. Просто я пытался создать экземпляр класса MyVector, как будто я объявлял функцию.

Этот код:

Vector2D<int, int> vec1();

Должно было:

Vector2D<int, int> vec1;

Легко, как торт. Еще раз спасибо, дип.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector