2016-01-15 2 views
-2

Похоже Coord(a) не работает, а значения для lon и lat являются 00.0000 и 00.0000, те из конструктора по умолчанию. Что мне делать? У меня проблема с синтаксисом? Разве это не in >> Coord(a) читать lon и lat от базового класса?Прочитайте атрибут базового класса с использованием «IStream» из производного класса

//base class 
class Coord { 
    private: 
    double lon; 
    double lat; 
Coord() { lon = 00.000000000000000; lat = 00.000000000000000; } 
//..... 
//..... 
//..... 
friend istream& operator>>(istream& in, Coord& temp) 
{ 
    cout << "Longitude is : "; in >> temp.lon; 
    cout << "Latitude is : "; in >> temp.lat; 
    return in; 
} 
}; 

//derived class 
class Location : public Coord { 
private: 
    char model[6]; 
    double time; 
    int speed; 
//..... 
//..... 
//..... 
friend istream& operator>>(istream& in, Location& a) 
{ 
    cout << "Model is : "; in >> a.model; 
    cout << "Time is : "; in >> a.time; 
    cout << "Speed is : "; in >> a.speed; 
    cout << "Coordinates : " << endl; in >> Coord(a); 
    return in; 
} 
}; 
void main() 
{ 
    Location loc; 
    cin>>loc; cout<<loc; 
} 
+2

'Координаты (a)' создает временное? – LogicStuff

+2

Ваш минимальный пример даже не близок к компиляции. –

ответ

0

Как я уже сказал, Coord(a) создает копию (много как object slicing). Ваш код не должен компилироваться, потому что вы передаете значение rvalue на operator>>, которое принимает ссылку lvalue.

Вы должны использовать static_cast, чтобы получить присвоенный к Coord базового класса:

in >> static_cast<Coord&>(a); 

Это сделает его называют право operator>>.

+0

Он работает. Большое спасибо ! Но не могли бы вы объяснить мне подробно? Создает ли он временный lon и lat? – Mihai

+0

Я добавил ссылку. – LogicStuff

+0

@Mihai А что с '00.000000000000'? Разве '0' недостаточно? 'double' не является' std :: string', он все равно будет усечен. – LogicStuff