2013-11-28 2 views
0
class base 
{ 
    int a, b; 
public: 
    base(int a, int b); 
    { 
     a = a; 
     b = b;  
    } 
} 

istream& operator>>(istream& is, base& no) 
{ 
    int area, local; 
    cout << "Area Code  : "; 
    is >> area; 
    cout << "Local number : "; 
    is >> local; 
    // call two argument constructor; 
    return is; 
} 

Я попытался base(area,local);, но после выполнения значения изменяется обратно на 0Как вызвать два конструктора аргументов в istream & operator?

Я также попытался no(area,local);, что тоже не работает ...

+0

Кстати, у вашего конструктора нет определения. это даже компиляция? удалите ';' после конструктора и добавьте одно объявление после класса. – user1810087

ответ

1

Вы могли бы написать это как

no = base(area, local); 

Or , если вы сделаете operator>> другом вашего base c деваха, то вы можете изменить отдельные чтения, чтобы быть

is >> no.area; 
is >> no.local; 
1

То, что вы описываете, не является конструктором ; это оператор ввода (operator>>).

Для вашего класса base, вы могли бы назвать это так:

base b; 
std::cin >> b; 

И ваш оператор должен быть реализован как

istream& operator>>(istream& is, base& no) 
{ 
    cout << "Area Code  : "; 
    is >> no.area; 
    cout << "Local number : "; 
    is >> no.local; 
    // call two argument constructor; 
    return is; 
} 
0

Внутри вашего конструктора, вы делаете:

base(int a, int b); 
{ 
    a = a; 
    b = b;  
} 

Который только присваивает параметры сами, а не к переменным-членам объекта , Для того, чтобы изменить переменные-члены, вы должны сделать:

base(int a, int b) 
{ 
    this->a = a; 
    this->b = b;  
} 

синтаксис вызова это no = base(area, local);. Вам может также нужен оператор-ассистент, если ваша IDE не будет генерировать его для вас. Это, наверное, достаточно умный, чтобы сделать это, но просто давая вам голову.

+0

Если вы выполняете оператор копирования-назначения, вам необходимо следовать правилу 3. –

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