Как использовать STD в коде, не включая "использование пространства имен STD"? - PullRequest
0 голосов
/ 25 января 2019

В этом коде оператора Overloading я не хочу писать «используя пространство имен std», вместо этого я хочу включить «std ::» везде, где требуется.

После добавления »std :: "после cout и cin, я все еще получаю ошибки, где еще включить" std :: ".

#include<iostream>
//using namespace std;
class Complex
{
private:
  int real, imag;
public:
  Complex(int r = 0, int i = 0) : real(r), imag(i) {}

  friend ostream & operator << (ostream &, const Complex &);
  friend istream & operator >> (istream &, Complex &);
};

ostream & operator << (ostream &out, Complex &obj)
{
  out<<obj.real<<" "<<obj.imag;
  return out;
}
istream & operator >> (istream &in, const Complex &obj)
{
  in>>obj.real>>obj.imag;
  return in;
}

int main()
{
  Complex obj;
  std::cin>>obj;
  std::cout<<obj;
  return 0;
}

Он должен принимать два числа с использованием оператора istream и выводить два числа с помощью оператора ostream.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

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

Подсказка: они все в std.

Так что включает в себя std::ostream и std::istream.

0 голосов
/ 25 января 2019

Это просто проблема загрязнения пространства имен . Важность этого может варьироваться между использованиями.

Когда вы только создаете прототипы, using namespace std; - это хорошо, как и бесполезные заголовки на тот случай, если вам что-то понадобится от одного. Если вам нужен сверхбезопасный код, который будет подвергнут тщательному анализу, вы хотите предотвратить столкновение имен и загрязнение пространства имен, поэтому вы включаете в текущее пространство имен только то, что требуется, и даете явные пространства имен для идентификаторов, которые используются редко.

Это мое личное мнение (точнее то, как я привык работать):

  • когда символ используется редко, я даю ему его явное пространство имен (например: std::cout << i;)
  • когда символ интенсивно используется в модуле компиляции, я специально импортирую этот символ (например: using std::cout; ... cout << i; ... cout << j; ...)
0 голосов
/ 25 января 2019

добавить std:: к ostream и istream

Они взяты из заголовков <istream> и <ostream> и определены в <iosfwd>

#include<iostream>
//using namespace std;
class Complex
{
private:
    int real, imag;
public:

    Complex(int r = 0, int i = 0) : real(r), imag(i) {}

    friend std::ostream& operator<<(std::ostream& out, const Complex& obj);
    friend std::istream& operator>>(std::istream& in, Complex& obj);
};

std::ostream& operator<<(std::ostream &out, const Complex &obj)
{
    out << obj.real << " " << obj.imag;
    return out;
}
std::istream& operator>>(std::istream &in, Complex &obj)
{
    in >> obj.real >> obj.imag;
    return in;
}

int main()
{
    Complex obj;
    std::cin >> obj;
    std::cout << obj;
    return 0;
}

(не относится к проблеме std::) Вы также можете получить доступ к своим личным переменным вне класса без объявления friend, используя функции-члены get / set. Спасибо @aschepler за указание на мою ошибку в отношении доступности.

#include<iostream>
class Complex
{
private:
    int real, imag;
public:
    int get_real() const {
        return real;
    }
    void set_real(int real) {
        this->real = real;
    }
    int get_imag() const {
        return imag;
    }
    void set_imag(int imag) {
        this->imag = imag;
    }

    Complex(int r = 0, int i = 0) : real(r), imag(i) {}

};

std::ostream& operator<<(std::ostream &out, const Complex &obj)
{
    out << obj.get_real() << " " << obj.get_real();
    return out;
}
std::istream& operator>>(std::istream &in, Complex &obj)
{
    int real, imag;
    in >> real >> imag;
    obj.set_real(real);
    obj.set_imag(imag);
    return in;
}

int main()
{
    Complex obj;
    std::cin >> obj;
    std::cout << obj;
    return 0;
}
...