2015-08-13 4 views
0

Здесь значения x и y пытаются установить через конструктор базового класса.Почему конструктор базового класса не задает значения?

Но код не может это сделать.

#include <iostream> 

class Point2d { 
public: 
    double x; 
    double y; 
    Point2d() : x(0), y(0) { 
    } 
    Point2d(double x, double y) : x(x), y(y) { 
    } 
    void Show() { 
     std::cout << "(" << x << "," << y << ")\n"; 
    } 
}; 

class Vector2d : public Point2d { 
public: 
    Vector2d():Point2d(){ 
    } 
    Vector2d(double x, double y) : Point2d(x,y) {  
    } 
    Vector2d(Vector2d const& vec) : Point2d(vec){ 
    } 
    void Set(double x, double y) { 
     Point2d::Point2d(x, y); 
    } 
}; 

int main() { 
    Vector2d v; 
    v.Set(20, -39); 
    v.Show(); // prints '(0,0)' instead of '(20,-39)' 
} 

Моей целью является повторное использование конструктора базового класса и перегруженных операторов присваивания как можно больше.

+3

Вы ни сказали точно, что произошло, ни то, что вы ожидали. Тем не менее, вы пытаетесь вызвать конструктор вне конструкции объекта, но только создаете временный анонимный объект. Есть способы сделать то, что вы хотите, включая размещение нового, но подход является ошибочным. Просто установите значения. –

ответ

1

Боюсь, что ваш код не будет даже скомпилировать в

void Set(double x, double y) 
{ 
    Point2d::Point2d(x, y); 
} 

конструктор базового класса должен быть вызван в начале члена инициализатора списков конструктора подкласса, а не в функции члена ,

Что вам нужно, это, вероятно,

class Point2d { 
public: 
    double x; 
    double y; 
    Point2d() : x(0), y(0) { 
    } 
    Point2d(double x, double y) : x(x), y(y) { 
    } 
    void Show() { 
     std::cout << "(" << x << "," << y << ")\n"; 
    } 
    Point2d& operator=(Point2d const& rhs) 
    { 
     this->x = rhs.x; 
     this->y = rhs.y; 
    } 
}; 

class Vector2d : public Point2d { 
public: 
    Vector2d():Point2d(){ 
    } 
    Vector2d(double x, double y) : Point2d(x,y) {  
    } 
    Vector2d(Vector2d const& vec) : Point2d(vec){ 
    } 

    /* also need to be overloaded in the subclass */ 
    Vector2d& operator=(Vector2d const& rhs) 
    { 
     Point2d::operator=(rhs); 
     return *this; 
    } 

    void Set(double x, double y) { 
     *this = Vector2d(x, y); 
    } 
}; 

int main() { 
    Vector2d v; 
    v.Set(20, -39); 
    v.Show(); 
} 
+0

Он компилируется, но значения не задаются. – anonymous

+0

В чем проблема с этим кодом: 'class Vector2d: publicPoint2d {void Set (double x, double y) {* this = Vector2d (x, y); } void Set (Vector2d const & vec) {* this = Vector2d (vec); }}; ' – anonymous

+0

Он не включен в код вашего вопроса. Вы вставляете неправильный код? Я пытаюсь скомпилировать ваш код (обновленный) с помощью 'g ++' или 'g ++ -std = C++ 0x', он действительно дает ошибку в функции' Set'. – neuront

0

Ну, вы пытаетесь построить базовый класс в функции setter, но базовый класс уже будет построен при построении производного класса. Я бы просто установил значения x и y базового класса в установщике.

+0

В чем проблема с этим кодом: 'class Vector2d: publicPoint2d {void Set (double x, double y) \t { \t \t * this = Vector2d (x, y); \t} \t недействительными набор (Vector2d Const & VEC) \t { \t \t * это = Vector2d (VEC); \t}}; ' – anonymous

Смежные вопросы