Структуры C ++ не компилируются ... не инициализированы должным образом?Не используете их правильно? - PullRequest
0 голосов
/ 25 ноября 2011

Я пытаюсь использовать вложенные структуры / структуры, и после нескольких часов псевдокода и попыток конечный результат, который я приду, не работает или не компилируется.

Я бы хотел взять два вектора A и B и сравнить их друг с другом. Я установил вложенную структуру для чтения начальной и конечной точки вектора и самой структуры вектора. Поэтому я думаю, что, возможно, я делаю что-то не так в дальнейшем, но я застрял.

    #include <iostream>
    #include <cmath>
    #include <string>

    using namespace std;
struct Point    // Reads in three coordinates for point to make a three dimensional vector
{
    double x;
    double y;
    double z;
};
struct MathVector   // Struct for the start and end point of each vector.
{
    Point start;
    Point end;
};
Point ReadPoint()
{
    Point pt; // Letter distinguishes between vector A and vector B, or "letterA" and "letterB"
    double x, y, z;

    cout << "Please input the x-coordinate: " << endl;
    cin >> pt.x;
    cout << "Please input the y-coordinate: " << endl;
    cin >> pt.y;
    cout << "Please input the z-coordinate: " << endl;
    cin >> pt.z;

    return pt;
}
void DotProduct (MathVector letterA, MathVector letterB, double& a_times_b ) //formula to compute orthogonality
{
    a_times_b = (letterA.end.x - letterA.start.x)*(letterB.end.x - letterB.start.x) + (letterA.end.y - letterA.start.y)*(letterB.end.y - letterB.start.y) + (letterA.end.z - letterA.start.z)*(letterB.end.z - letterB.start.z);
}
int main()
{
    MathVector letterA;
    MathVector letterB;
    double a_times_b;

    letterA = ReadPoint();
    letterB = ReadPoint();

    DotProduct (letterA, letterB, a_times_b);

    cout << "The vector " << letterA << " compared with " << letterB << " ";
    if ( a_times_b == 0)
        cout << "is orthoganal." << endl;
    else
        cout << "is not orthoganal." << endl;

    return 0;
}

Ответы [ 5 ]

2 голосов
/ 25 ноября 2011

Одна проблема связана с вашим ReadPoint с типом возврата Point, но вы возвращаете экземпляр MathVector. Кроме того, вы читаете входные данные в переменные, которые в конечном итоге игнорируются.

Вы должны написать ReadPoint как:

Point ReadPoint()
{
    Point p;
    cout << "Please input the x-coordinate: " << endl;
    cin >> p.x;
    cout << "Please input the y-coordinate: " << endl;
    cin >> p.y;
    cout << "Please input the z-coordinate: " << endl;
    cin >> p.z;
    return p;
}

Или немного лучшая версия:

Point ReadPoint()
{
    Point p;
    cout << "Please enter point-coordinate : " << endl;
    cin >> p.x >> p.y >> p.z; //example input : 1 2 3 
    return p;
}

Или, еще лучше, перегрузить >> оператор как:

std::istream & operator>>(std::istream & in, Point & p)
{
    cout << "Please enter point-coordinate : " << endl;
    return cin >> p.x >> p.y >> p.z; //example input : 1 2 3 
}

//Use this as
Point pointA, pointB;
cin >> pointA >> pointB;

Теперь прочитайте хорошую книгу по C ++. Если вы уже читаете один, то убедитесь, что это действительно хорошо. Вот список действительно хороших книг по C ++ всех уровней:

0 голосов
/ 25 ноября 2011

Нет совпадения для ошибки operator = означает, что нет функции для присвоения MathVector точке. Вы вызываете ReadPoint (), который возвращает Point, и пытаетесь присвоить возвращаемое значение переменной типа MathVector. Компилятор не может автоматически создать функцию преобразования. Вы должны предоставить один самостоятельно. Возможно, вы имели в виду

letterA.start = ReadPoint();
letterA.end   = ReadPoint();
0 голосов
/ 25 ноября 2011

letterA и letterB относятся к типу MathVector

 MathVector letterA;
        MathVector letterB;
        double a_times_b;

        letterA = ReadPoint();
        letterB = ReadPoint();

вы должны создать другой метод для чтения Mathvector .. как вы делаете с Point.

и в методе ReadPoint

тип возвращаемого значения должен быть Point. Если вы читаете точку, выполните здесь вычисления, чтобы создать объект в формате MathVector go tet startpoint и endpoint.

0 голосов
/ 25 ноября 2011
Point ReadPoint()
{
   MathVector letter; // Letter distinguishes between vector A and vector B, or "letterA" and "letterB"
    double x, y, z;

   cout << "Please input the x-coordinate: " << endl;
   cin >> x;
   cout << "Please input the y-coordinate: " << endl;
   cin >> y;
   cout << "Please input the z-coordinate: " << endl;
   cin >> z;

   return letter;

}

Вы не объяснили, что вы пытаетесь сделать или какие у вас ошибки, но этот код имеет смысл нет .У вас есть три переменные, x, y и z.Вы заполняете их значениями, которые вы получаете от пользователя.Тогда вы ничего не делаете с этими переменными и возвращаете MathVector, созданный конструктором по умолчанию, даже если вы говорите, что собираетесь вернуть Point.Это имеет очень мало смысла.

0 голосов
/ 25 ноября 2011
  1. ReadPoint возвращает букву типа MathVector вместо точки
  2. Вы не перегружены оператором <<, чтобы сказать ему, как обрабатывать объекты MathVector </li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...