2010-02-13 7 views
-1

I 부울 연산자 다음과 같은 문제를 가지고()부울 연산자()와 파생 클래스의 상속

기본 클래스

class Point 
{ 
double x, y; 
public: 
Point(){x=0;y=0;} 
... 
} 

파생 클래스

class 3DPoint : public Point 
{ 
double z; 
public: 
3DPoint(double x, double y, double zx) : Point(x,y){z(zz);} 
... 
} 

연산자()

class compareByX 
{ 
bool operator() (const 3DPoint *p1, const 3DPoint *p2) const 
{ 
return p1->x < p2->x; //Compilation error 
} 
} 

c 점의 작성자

class List: public list<3DPoint *> 
{ 
... 
} 


int main() 
{ 
List l;; 
l.push_back(new 3DPoint(1,2,3)); 
l.push_back(new 3DPoint(4,5,6)); 
sort(l.begin(), l.end(), compareByX); 
} 

컴파일은 compareByX 클래스에서 다음 메시지와 함께 중단됩니다. 3DPoint const를 Point로 변환 할 수 없습니다. const 선언을 삭제했습니다 ...

class compareByX 
{ 
bool operator() (3DPoint *p1, 3DPoint *p2) const 
{ 
return p1->x < p2->x; //Compilation error 
} 
} 

... 및 ... 성공적인 컴파일. 하지만 operator()는 잘 정의되어 있지 않습니다. 도와 줄수있으세요? 아마도 더 적합한 객체 모델을 제안하는 것이 낫습니다 ... 고맙습니다.

+1

3DPoint? 식별자는 숫자로 시작할 수 없습니다. –

+1

죄송하지만 C#이 아닙니다. C++과 비슷한가? –

+0

@ Michael Stum : 예, 그렇습니다. 그리고 태그를 고쳤습니다. – dirkgently

답변

0
  • 클래스 및 구조 정의는 x,y,zprivate 회원 여러분의 숫자
+0

물론 3DPoint 대신 Point3D가 있어야합니다 ... 페이지의 텍스트를 다시 쓰는 중 오류가 발생했습니다 ...하지만 내 PC의 소스 코드가 올바르게 작성되었습니다 .--). – Ian

+1

이 재 작성 과정 중에 다른 실수를하지 않았다는 것을 어떻게 알 수 있습니까? – Manuel

+1

@Ian : 실제 답변을 원하면 실제 코드를 게시하십시오. 기록해야 – dirkgently

2

시작할 수없는 ;

  • 식별자 이름으로 따라야합니다, 당신은 클래스 외부에서 액세스하려고합니다. 을 만들거나 x,y,zpublic으로 만들거나 세터/게터를 제공하십시오.

    편집 : 코드에 대한
    커플 가지 더 :

    1. 가 수행 하지 상속 당신의 class Liststd::list에서, 표준 컨테이너는 하지 기본 클래스로 사용되는 것을 의미했다. std::container에서 사용할 수없는 특별한 기능이 필요하다면, 상속하는 대신에 할 수있는 무료 기능을 제공하십시오.
    2. 여기서 질문의 유형을 고려하여 자신의 컨테이너를 구현하는 것이 가장 좋은 방법은 아닐 수 있습니다. 표준 표준을 사용하고, them을 많이 가지고 있으며, 대부분 사용자의 요구에 맞을 것입니다.
    3. 한 클래스를 다른 클래스에서 상속하는 경우 기본 클래스는 보통 virtual이어야합니다.
    4. Point3D는 더 같은 Point2DPoint3D 포인트의 일종이다,Point2D종류가 아닙니다. 나에게 이런 종류의 상속은 조금 더 의미가있을 것이다.

    그냥이 컴파일러 오류를 추측하지 않으려면이 코드를 시도해보십시오. 대략 생각한 것 같습니다.

    #include <algorithm> 
    #include <iostream> 
    #include <vector> 
    
    class Point 
    { 
    public: 
        Point() {} 
        virtual ~Point() {} 
    
        virtual void some_function_relevant_to_all_points() {} 
    
    private: 
        // maybe some members here 
    }; 
    
    class Point2D : public Point 
    { 
    public: 
        Point2D(double x, double y) 
         : x_(0), 
          y_(0) 
        {} 
        ~Point2D() {} 
    
    private: 
        double x_; 
        double y_; 
    }; 
    
    class Point3D : public Point 
    { 
    public: 
        Point3D(double x, double y, double z) 
         : x_(x), 
          y_(y), 
          z_(z) 
        {} 
        ~Point3D() {} 
    
        double get_x() const {return x_;} 
        double get_y() const {return y_;} 
        double get_z() const {return z_;} 
    
    private: 
        double x_; 
        double y_; 
        double z_; 
    }; 
    
    class Compare3DPointByX 
    { 
    public: 
        bool operator()(const Point3D *lhs, const Point3D *rhs) const 
        { 
         return lhs->get_x() < rhs->get_x(); 
        } 
    }; 
    
    class DeleteElement 
    { 
    public: 
        template <typename T> 
        void operator()(T *arg) 
        { 
         delete arg; 
        } 
    }; 
    
    int main() 
    { 
        std::vector<Point3D *> points3d; 
        points3d.push_back(new Point3D(4,5,6)); 
        points3d.push_back(new Point3D(1,2,3)); 
    
        std::cout << "point 1:" << points3d[0]->get_x() << "\n"; 
        std::cout << "point 2:" << points3d[1]->get_x() << "\n"; 
    
        std::sort(points3d.begin(), points3d.end(), Compare3DPointByX()); 
    
        std::cout << "point 1:" << points3d[0]->get_x() << "\n"; 
        std::cout << "point 2:" << points3d[1]->get_x() << "\n"; 
    
        std::for_each(points3d.begin(), points3d.end(), DeleteElement()); 
        return 0; 
    } 
    

    나머지 기능은 사용자가 직접 추가 할 수 있습니다.이 예제는 구현 방법을 알려주는 것입니다.

    희망, 행운을 빕니다.

  • +0

    , 고맙습니다 클래스 compareByX { 불리언 연산자() (* 3DPoint의 P1, P2 * 3DPoint) CONST {P1- 창> getX() < p2-> getX(); // 컴파일 오류 } } – Ian

    +0

    @Ian, 답변을 업데이트했습니다. 이제는 도움이 될 것입니다. – Dmitry

    +0

    나는 포인트 넘버 3에 전혀 동의하지 않는다.그 근거가 뭐야? – Manuel

    0

    나는 당신이 그런 std::list, 당신은 std::vector 같은 랜덤 액세스를 지원하는 뭔가가 필요합니다 정렬 할 수 없습니다

    class Point3D : public Point 
    { 
    double z; 
    public: 
    Point3D(double x, double y, double zx) : Point(x,y){z(zz);} 
    ... 
    } 
    
    class compareByX 
    { 
    bool operator() (Point3D *p1, Point3D *p2) const 
    { 
    return p1->getX() < p2->getX(); //Compilation error 
    } 
    } 
    
    
    class List: public list<Point3D *> 
    { 
    ... 
    } 
    
    
    int main() 
    { 
    List l;; 
    l.push_back(new Point3D(1,2,3)); 
    l.push_back(new Point3D(4,5,6)); 
    sort(l.begin(), l.end(), compareByX); 
    } 
    
    +0

    이것은 여전히 ​​C++가 아닙니다. Point3D 생성자에는 두 개의 구문 오류가 있으며 클래스 정의가 종료되지 않습니다. 코드에 대한 변경 사항이 버그의 원인을 숨길 가능성이 큽니다. 실제로 컴파일하고 실행 한 코드를 게시하십시오. – Porculus

    +0

    나는 지난 10 분 동안 마음을 읽고 문제를 되풀이하려고 노력했다. 나는 실패했다. 비슷한 오류 메시지가 나타 났지만 const를 제거해도 컴파일되지 않았습니다. 죄송 합니다만, 공은 내가 걱정하는 한 당신의 법정에서 확고합니다. – Porculus

    +1

    @ 이안 - 원본 질문을 이와 같은 추가 답변으로 수정하지 말고 수정하십시오. – Manuel

    0

    코드 (확인을위한 thans), 같은 질문을 .... 수정 . 어느 쪽이든이 sort 멤버 함수를 사용하거나 :

    l.sort(compareByX()); 
    

    주 내가 compareByX에 추가 한 괄호를, 당신은 펑터를 구성해야하고 괄호가 무엇인지입니다.

    operator() 또한 sort 알고리즘이이를 호출 할 수 있도록 공용 멤버 함수를 만들어야합니다. 이를 달성하는 가장 간단한 방법은 펑 구조체하고있다 :

    struct compareByX 
    { 
        bool operator() (Point3D const *p1, Point3D const *p2) const 
        { 
         return p1->getX() < p2->getX(); 
        } 
    }; 
    

    당신은 또한 당신의 getX 멤버 함수를 공개해야 의심을하지만 당신의 그 부분을하지 않았기 때문 얘기하기는 어렵습니다 당신의 암호.

    마지막으로,이 특정 예제에 대한 포인터/힙 할당이 필요하지 않다고 생각합니다. 스택에 포인트를 작성하면 프로그램이 더 빠르고 강력 해집니다.

    추신 : 다음 번에 실제 코드를 게시하십시오. 도움을 요청하는 사람들에게 훨씬 쉽게 표시됩니다.

    관련 문제