2014-09-11 3 views
-2
class complex1 
{ 
    public: 
     int real,img; 
     complex1(){} 
     complex1(int a) 
     { 
      real=a; 
      img=a; 
     } 
     complex1(int a,int b) 
     { 
      real=a; 
      img=b; 
     } 

     complex1 sum(int x,complex1 y); 
     complex1 sum(complex1,complex1); 
     complex1 display(complex1); 
}; 

complex1 complex1::sum(int x,complex1 y) 
{ 
    complex1 num; 
    num.real=x+y.real; 
    num.img=y.img; 
    return num; 
} 

complex1 complex1::sum(complex1 a,complex1 b) 
{ 
    complex1 num; 
    num.real=a.real+b.real; 
    num.img=a.img+b.img; 
    return num; 

} 

complex1 complex1::display(complex1 c) 
{ 
    cout<<"The complex number is:\n"; 
    cout<<c.real<<"+i"<<c.img; 
} 

main() 
{ 
    complex1 p,q,r,s; 
    p=complex1(2,4); 
    q=complex1 (3,5); 


    cout<<"\n"; 
    cout<<"p="<<display(p); 
    cout<<"q="<<display(q); 
} 

Используя конструкторы, нам нужно добавить два комплексных числа. Я получаю ошибкуДобавить комплексные номера телефонов

Error: display was not declared in this scope.

Любые предложения? где я ошибаюсь?

+0

Эй, пожалуйста, добро пожаловать! Ваш вопрос, вероятно, будет закрыт, потому что он не представляет [MCVE] (http://stackoverflow.com/help/mcve). В нем также отсутствует описание любых исследовательских работ, которые вы должны были предпринять, прежде чем публиковать вопрос. –

+2

Возможно, это не полезно, но 'std :: complex', вероятно, сделает все, что вы захотите. Тем не менее, 'display' является членом' complex1', который должен намекать на то, что пошло не так. – icabod

ответ

1

Вы получаете эту ошибку, потому что вы вызываете display() вне реализации метода экземпляра, не вызывая его в экземпляре complex1, поэтому компилятор не знает, где его найти.

Вам нужно было бы назвать это чем-то вроде p.display(p).

Однако, у вас есть еще несколько серьезных ошибок здесь:

  1. В sum() и display() методы не делают ничего с this, и поэтому они действуют как статические методы, но все еще требуют экземпляра. Это смущает. Сделайте их статичными. (Метод sum() должен вероятно быть реализован в виде перегрузки в + оператора, в любом случае.)

  2. Метод display() должен вероятно быть реализован в виде перегрузки в << оператора, принимая std::ofstream& в качестве левого операнда, и он должен вернуть std::ofstream& вместо a complex1 объект. (А в вашей реализации она даже не возвращает complex1 объекта на всех, даже если он объявлен. Это ошибка.)

Например, чтобы установить первую точку, я бы удалить sum() методы в целом и пойти со свободным оператором, что-то вроде этого:

complex1 operator+(complex1 const & a, complex1 const & b) 
{ 
    return complex1(a.real + b.real, a.img + b.img); 
} 

Поскольку вашего complex1(int) конструктора неявно неявный (ха!) этот оператор может работать с complex1 + complex1, complex1 + int и int + complex1 автоматически. (Но обратите внимание, что ваш конструктор complex1(int) присваивает аргумент как real, так и img, что, вероятно, является ошибкой, я бы ожидал, что вы захотите инициализировать img вместо нуля.)

Чтобы исправить второй вопрос, я хотел бы удалить метод display() полностью и пойти со свободным оператором, что-то вроде этого:

std::ofstream & operator<<(std::ofstream & s, complex1 const & c) 
{ 
    return s << c.real << "+i" << c.img; 
} 

Тогда, чтобы вывести номер, который вы могли бы сделать что-то вроде:

std::cout << "p=" << p; 
0

Функция display должна вернуть объект complex1, как вы сказали, он будет в классе. В противном случае, вы можете изменить заглушку для

void display(complex1); 

Кроме того, display функция член, то есть он должен быть вызван экземпляр класса. Вам нужно сделать

p.display(); 

Кроме того, вместо того, чтобы использовать ваши sum функции, вы можете перегрузить оператор + для обоих int х и других complex1-х:

complex1 operator+(const complex1 &c1, const complex1 &c2); 
Смежные вопросы