如何在代码中使用性病而不包括“使用命名空间性病”?

时间:2019-01-25 12:23:58

标签: c++ operator-overloading std

在此运算符重载代码中,我不想在需要的地方写“ using namespace std”,而是想包含“ std ::”。

在cout和cin之后添加“ std ::”后,我仍然在其他地方包含“ 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 :(得分:4)

std::添加到ostreamistream

它们来自标头<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::问题无关) 您还可以通过使用get / set成员函数来在类的外部访问私有变量,而无需进行friend声明。感谢@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;
}

答案 1 :(得分:0)

您最喜欢的标准库参考告诉您其中包含什么名称空间。在这样的小程序中,您可以简单地依次查找每个名称空间。

提示:它们都在std中。

因此包括std::ostreamstd::istream

答案 2 :(得分:0)

这只是一个命名空间污染问题。每次使用时,它的重要性可能会有所不同。

在制作原型时,using namespace std;很好,包括无用的标头也可以,以防万一。当您想要一个将被广泛审查的超级安全代码时,您想要防止名称冲突和名称空间pollutino,因此,您仅在当前名称空间中包含所需的内容,并为很少使用的标识符提供明确的名称空间。

以下是我的看法(或更确切地说是我的工作方式):

  • 当很少使用符号时,我给它指定显式名称空间(例如:std::cout << i;
  • 当在编译单元中大量使用符号时,我专门导入该符号(例如:using std::cout; ... cout << i; ... cout << j; ...