2016-11-26 2 views
0

У меня возникли проблемы с попыткой реализовать объекты класса Cart_Vector в классе Cart_Point. Мой компилятор был перечисляя следующие ошибки, и я не могу их исправить:Реализация объектов из одного класса в другом

оператор друг Cart_Point + (сопзЬ Cart_Point & p1, Const Cart_Vector & v1); 'Cart_Vector' не называет тип

оператор Cart_Point + (Const Cart_Point & р1, Const Cart_Vector & v1) 'Cart_Vector' не имеют тип

х = p1.x + v1.x; запрос для члена 'x' в 'v1', который не относится к классу тип 'const int'

y = p1.y + v1.y; запрос для члена 'y' в 'v1', который не относится к классу тип 'const int'

return Cart_Vector (x, y); 'Cart_Vector' не был объявлен в этой области

#include <iostream> 
#include <math.h> 


using namespace std; 

class Cart_Point 
{ 
public: 

     double x; 
     double y; 

     friend class Cart_Vector; 

    Cart_Point (double inputx, double inputy); 
    friend Cart_Point operator<<(const Cart_Point&p1, const Cart_Point&p2); 
    friend Cart_Point operator+(const Cart_Point&p1,const Cart_Vector&v1); 
    friend Cart_Point operator-(const Cart_Point&p1,const Cart_Point&p2); 

    double Cart_distance(Cart_Point, Cart_Point); 


}; 

Cart_Point::Cart_Point(double inputx, double inputy) 
{ 
    x = inputx; 
    y = inputy; 
} 

double Cart_Point::Cart_distance(Cart_Point p1, Cart_Point p2) 
{ 
    double distance = (sqrt(pow(p1.x - p2.x,2) + pow(p1.y - p2.y,2))); 
    return distance; 

//returns distance between p1 (point 1) and p2 (point 2) 
} 

Cart_Point operator<<(const Cart_Point&p1, const Cart_Point&p2) 
{ 
    cout << "p1:(" << p1.x << ", " << p1.y << ")" << endl; 
    cout << "p2:(" << p2.x << ", " << p2.y << ")" << endl; 
    return p1,p2; 
//this function should just print each point 
} 

Cart_Point operator+(const Cart_Point&p1, const Cart_Vector&v1) 
{ 
    double x,y; 

    x = p1.x + v1.x; 
    y = p1.y + v1.y; 

    return Cart_Point(x,y); 

//this function should make a new Cart_Point 
} 

Cart_Point operator-(const Cart_Point&p1, const Cart_Point&p2) 
{ 
    double x,y; 
    x = p1.x- p2.x; 
    y = p1.y - p2.y; 

    return Cart_Vector(x,y); 

//this function should make a new Cart_Vector 
} 

    class Cart_Vector 
{ 
public: 
    double x; //x displacement of vector 
    double y; //y displacement of vector 

    Cart_Vector(double inputx, double inputy); 

    friend Cart_Vector operator*(const Cart_Vector&v1, double d); 
    friend Cart_Vector operator/(const Cart_Vector&v1, double d); 
    Cart_Vector operator<<(const Cart_Vector&v1); 

    friend class Cart_Point; 
}; 

Cart_Vector::Cart_Vector(double inputx, double inputy) 
{ 
    x = inputx; 
    y = inputy; 
} 

Cart_Vector operator*(const Cart_Vector&v1, double d) 
{ 
    double x,y; 
    x = v1.x*d; 
    y = v1.y*d; 

    return Cart_Vector(x,y); 

//this function should make a new Cart_Vector 
} 

Cart_Vector operator/(const Cart_Vector&v1, double d) 
{ 
    double x,y; 
    if (d == 0) 
    { 
     x = v1.x; 
     y = v1.y; 
    } 

    x = v1.x/d; 
    y = v1.y/d; 

    return Cart_Vector(x,y); 

//this function should make a new Cart_Vector and dividing by zero creates v1 
} 

Cart_Vector Cart_Vector::operator<<(const Cart_Vector&v1) 
{ 
    cout <<"v1: <" << v1.x << ", " << ">" << endl; 
    return v1; 

//this function should just print v1 
} 


//TestCheckpoint1.cpp file below 
int main() 
{ 

//I haven't finished the main function to test all the functions yet 
    return 0; 
} 
+0

Определение '' Cart_Vector' перед тем Cart_Point', поскольку последний использует первое, но не наоборот. –

ответ

0

Cart_Vector и Cart_point нуждаются друг в друге. Поэтому вам нужно реализовать эти классы в отдельных файлах заголовков. Не забудьте включить их. Также здесь;

Cart_Point operator-(const Cart_Point&p1, const Cart_Point&p2) 
{ 
    double x,y; 
    x = p1.x- p2.x; 
    y = p1.y - p2.y; 

    //return Cart_Vector(x,y); 
    return Cart_Pointer(x,y); 
//this function should make a new Cart_Vector 
} 

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

+0

Я предполагаю, что проблема здесь возвращена Cart_Point (x, y); shoule be correct – Adib

+0

Да, эта функция не может вернуть Cart_ Vector (x, y). – mcemilg

0

Сделайте себе одолжение и разделите свой код в разных файлах, по крайней мере на один .h для Cart_Vector, один .h для Cart_Point и один .cpp для тестового скрипта (main). Вы можете исправить этот код, чтобы он работал (просто замените порядок двух классов), если вы исправляете и другие ошибки, например, при перегрузке оператора «-».

Дело в том, что если вы начнете кодирование таким образом, при запуске программирования сложных проектов вы столкнетесь с большими трудностями. Кодирование одного общедоступного (не внутреннего) класса для файла похоже на применение принципа Single Responsibility для файлов. Я бы сказал, что и файл должен иметь только одну причину изменения, и это имеет большие преимущества в читабельности и когда вы будете исполнять контроль версии.

1

разделить ваш код в разных файлах, но ваша реализация оператора < < неправильно, рассмотрим следующий код, его просто намек, чтобы помочь

#include <iostream> 
#include <math.h> 


using namespace std; 


class Cart_Vector 
{ 
public: 
double x; //x displacement of vector 
double y; //y displacement of vector 

Cart_Vector(double inputx, double inputy); 

friend Cart_Vector operator*(const Cart_Vector&v1, double d); 
friend Cart_Vector operator/(const Cart_Vector&v1, double d); 
friend std::ostream& operator<<(std::ostream& out,const Cart_Vector&v1); 

friend class Cart_Point; 
}; 


Cart_Vector::Cart_Vector(double inputx, double inputy) 
{ 
    x = inputx; 
    y = inputy; 
} 

Cart_Vector operator*(const Cart_Vector&v1, double d) 
{ 
    double x,y; 
    x = v1.x*d; 
    y = v1.y*d; 

    return Cart_Vector(x,y); 

//this function should make a new Cart_Vector 
} 

Cart_Vector operator/(const Cart_Vector&v1, double d) 
{ 
    double x,y; 
    if (d == 0) 
    { 
     x = v1.x; 
     y = v1.y; 
    } 

    x = v1.x/d; 
    y = v1.y/d; 

    return Cart_Vector(x,y); 

//this function should make a new Cart_Vector and dividing by zero creates v1 
} 

std::ostream& operator<<(std::ostream &out, const Cart_Vector&v1) 
{ 
    out <<"v1: <" << v1.x << ", " << ">" << endl; 
    return out; 

//this function should just print v1 
} 


class Cart_Point 
{ 
public: 

     double x; 
     double y; 

     friend class Cart_Vector; 

    Cart_Point (double inputx, double inputy); 
    friend std::ostream& operator<<(std::ostream& out , const Cart_Point&p2); 
    friend Cart_Point operator+(const Cart_Point&p1,const Cart_Vector&v1); 
    friend Cart_Point operator-(const Cart_Point&p1,const Cart_Point&p2); 

    double Cart_distance(Cart_Point, Cart_Point); 


}; 

Cart_Point::Cart_Point(double inputx, double inputy) 
{ 
    x = inputx; 
    y = inputy; 
} 

double Cart_Point::Cart_distance(Cart_Point p1, Cart_Point p2) 
{ 
    double distance = (sqrt(pow(p1.x - p2.x,2) + pow(p1.y - p2.y,2))); 
    return distance; 

//returns distance between p1 (point 1) and p2 (point 2) 
} 





std::ostream& operator<<(std::ostream &out, const Cart_Point&p1) 
{ 
    // Since operator<< is a friend of the Cart_Point class, we can access Point's members directly. 
    out << "p:(" << p1.x << ", " << p1.y << ")" << endl; 

    return out; 
//this function should just print each point 
} 

Cart_Point operator+(const Cart_Point&p1, const Cart_Vector&v1) 
{ 
    double x,y; 

    x = p1.x + v1.x; 
    y = p1.y + v1.y; 

    return Cart_Point(x,y); 

//this function should make a new Cart_Point 
} 

Cart_Point operator-(const Cart_Point&p1, const Cart_Point&p2) 
{ 
    double x,y; 
    x = p1.x- p2.x; 
    y = p1.y - p2.y; 

    return Cart_Point(x,y); 

//this function should make a new Cart_Vector 
} 


//TestCheckpoint1.cpp file below 
int main() 
{ 

Cart_Point point1(2.0, 3.0); 

    std::cout << point1; 


//I haven't finished the main function to test all the functions yet 
    return 0; 
} 

Wandbox :