m0_59296674 2021-07-13 19:34 采纳率: 100%
浏览 59
已采纳

名称空间与友元函数的相关问题?

/放在命名空间中的一个类 vector.h
namespace vector_namespace {
    class Vector {
    public:
        enum class Mode { Rect, Pol };

        Vector();
        Vector(double x, double y, Mode mode = Mode::Rect);
        friend std::ostream& operator<<(std::ostream& os, const Vector& vector);
    private:
        double X;
        double Y;
        double Mag;
        double Ang;
        Mode Mode;
    };
}

/vector.cpp
namespace vector_namespace {
Vector::Vector(const double x, const double y, const enum Mode mode) {
        Mode = mode;
        if (mode == Mode::Pol) {
            Mag = x;
            Ang = y;
            SetX();
            SetY();
        }
        else if (mode == Mode::Rect) {
            X = x;
            Y = y;
            SetMag();
            SetAng();
        }
        else {
            X = Y = Mag = Ang = 0.0;
            Mode = Mode::Rect;
        }
    }
std::ostream& operator<<(std::ostream& os, const Vector& vector) {
        if (vector.Mode == Vector::Mode::Rect) {
            os << "(x,y) = (" << vector.X << ", " << vector.Y << ")";
        }
        else if (vector.Mode == Vector::Mode::Pol) {
            os << "(m,a) = (" << vector.Mag << "," << vector.Ang * (45.0 / atan(1.0)) << ")";
        }
        else {
            os << "Vector object mode is invalid";
        }
        return os;
    }
}

上面的代码operator<<函数可以成功编译

/vector.cpp
namespace vector_namespace {
Vector::Vector(const double x, const double y, const enum Mode mode) {
        Mode = mode;
        if (mode == Mode::Pol) {
            Mag = x;
            Ang = y;
            SetX();
            SetY();
        }
        else if (mode == Mode::Rect) {
            X = x;
            Y = y;
            SetMag();
            SetAng();
        }
        else {
            X = Y = Mag = Ang = 0.0;
            Mode = Mode::Rect;
        }
    }
}
std::ostream& vector_namespace::operator<<(std::ostream& os, const Vector& vector) {
        if (vector.Mode == Vector::Mode::Rect) {
            os << "(x,y) = (" << vector.X << ", " << vector.Y << ")";
        }
        else if (vector.Mode == Vector::Mode::Pol) {
            os << "(m,a) = (" << vector.Mag << "," << vector.Ang * (45.0 / atan(1.0)) << ")";
        }
        else {
            os << "Vector object mode is invalid";
        }
        return os;
    }

而此时无法通过编译,请问为什么下面那种不能通过编译,明明也是把函数定义在了名称空间中,和上面一种放在大括号内有什么区别呢?

  • 写回答

7条回答 默认 最新

  • CSDN专家-link 2021-07-13 20:40
    关注
    .h:
    namespace vector_namespace {
        class Vector {
        public:
            enum Mode { Rect, Pol };
            Vector();
            Vector(double x, double y, Mode mode = Mode::Rect);
            friend std::ostream& operator<<(std::ostream& os, const Vector& vector);
        private:
            double X;
            double Y;
            double Mag;
            double Ang;
            Mode Mode;
        };
    }
    
    cpp:
    #include <iostream>
    using namespace std;
    
    #include "vector.h"
    
    namespace vector_namespace {
    Vector::Vector(const double x, const double y, const enum Mode mode) {
            Mode = mode;
            if (mode == Mode::Pol) {
                Mag = x;
                Ang = y;
             
            }
            else if (mode == Mode::Rect) {
                X = x;
                Y = y;
              
            }
            else {
                X = Y = Mag = Ang = 0.0;
                Mode = Mode::Rect;
            }
        }
    }
    std::ostream& vector_namespace::operator<<(std::ostream& os, const Vector& vector) {
            if (vector.Mode == Vector::Mode::Rect) {
                os << "(x,y) = (" << vector.X << ", " << vector.Y << ")";
            }
            else if (vector.Mode == Vector::Mode::Pol) {
                os << "(m,a) = (" << vector.Mag << "," << vector.Ang * (45.0 / atan(1.0)) << ")";
            }
            else {
                os << "Vector object mode is invalid";
            }
            return os;
        }
    
    
    void main()
    {
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 已采纳回答 7月13日
  • 创建了问题 7月13日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改