C++中的名空间

在写C++程序时一般都会有一句using namespace std;这里的std其实就是引入了一个名空间,其中cout和string函数就包含在此名空间中,如果在写程序时没使用std名空间,但又使用了cout、string等函数,那么将会出现以下错误:

名空间的引用方法最常见的就是通过关键语句using namespace加要引入的名空间,名空间也是一个类,也拥有其他的引入方法,例如下面通过程序模拟处理器处理信号的例子(通过“::”引入):

#ifndef SIGNAL_H_INCLUDED
#define SIGNAL_H_INCLUDED

#include <sstream>
#include <string>
#include <vector>

class Signal{  //信号类包含多个double类型变量
    std::vector<double> data;  //通过std::引入名空间std中的函数vector
public:
    Signal(){}

    Signal(const int SumData){
        for(unsigned int i = 0; i < SumData; i++)
            data.push_back(1 + 2 * i);  //生成信号,并放入容器中
    }

    int Number() const{
        return data.size(); //计算容器中的信号数量
    }

    double value(const int index) const{
        return data[index]; //得到特定得的信号
    }

    void attach(const double value){
        data.push_back(value); //存入信号
    }

    std::string text()const{  //同样地通过std::引入std中的函数string和stringstream
        std::stringstream ss;
        ss << "[ ";
        for(auto d: data)
            ss << d << " ";
        ss << "]";
        return ss.str();
    }
};

#endif // SIGNAL_H_INCLUDED
                            Signal.h文件
#ifndef PROCESSOR_H_INCLUDED
#define PROCESSOR_H_INCLUDED

#include "Signal.h"  //将信号文件引入

class Processor{  //处理器类,用来处理信号
public:
    Signal toProcess(const Signal& input)const{ inout//将输入信号传入
        Signal output; //定义输出信号
        for(int i = 0; i < input.Number(); i++)
            output.attach(-input.value(i));  //将输入信号中的信号值去翻并存入输出信号中
        return output;
    }
};

#endif // PROCESSOR_H_INCLUDED
                        processor.h文件

另一种方法就是直接定义名空间(namespace),例如:

#ifndef SIGNAL_H_INCLUDED
#define SIGNAL_H_INCLUDED

#include <sstream>
#include <string>
#include <vector>
namespace SignalProcess{ //定义一个名空间SignalProcess,用{}包含着的就是该名空间中的内容
    class Signal{  //信号类包含多个double类型变量
        std::vector<double> data;  //通过std::引入名空间std中的函数vector
    public:
        Signal(){}

        Signal(const int SumData){
            for(unsigned int i = 0; i < SumData; i++)
                data.push_back(1 + 2 * i);  //生成信号,并放入容器中
        }

        int Number() const{
            return data.size(); //计算容器中的信号数量
        }

        double value(const int index) const{
            return data[index]; //得到特定得的信号
        }

        void attach(const double value){
            data.push_back(value); //存入信号
        }

        std::string text()const{  //同样地通过std::引入std中的函数string和stringstream
            std::stringstream ss;
            ss << "[ ";
            for(auto d: data)
                ss << d << " ";
            ss << "]";
            return ss.str();
        }
    };
}
#endif // SIGNAL_H_INCLUDED
                Signal.h文件
#ifndef PROCESSOR_H_INCLUDED
#define PROCESSOR_H_INCLUDED

#include "Signal.h"  //将信号文件引入

namespace SignalProcess{ //将处理器类也放入该名空间中
    class Processor{  //处理器类,用来处理信号
    public:
        Signal toProcess(const Signal& input)const{ inout//将输入信号传入
            Signal output; //定义输出信号
            for(int i = 0; i < input.Number(); i++)
                output.attach(-input.value(i));  //将输入信号中的信号值去翻并存入输出信号中
            return output;
        }
    };
}
#endif // PROCESSOR_H_INCLUDED
                Processor.h文件
#include "Processor.h"
#include <iostream>

int main(){
    SignalProcess::Signal signalInput(5);  //通过空间名访问其中的Signal类并分配对象
    std::cout << "Input Signal: " << signalInput.text() << std::endl;
    SignalProcess::Processor processor;
    SignalProcess::Signal SignalOutput = processor.toProcess(signalInput);
    std::cout << "Output Signal: " << SignalOutput.text() << std::endl;
}
                main.cpp文件

也可以通过using直接使用名空间SignalProcess。

#include "Processor.h"
#include <iostream>
using  namespace SignalProcess;  //通过using直接饮用自定义的名空间

int main(){
    Signal signalInput(5);
    std::cout << "Input Signal: " << signalInput.text() << std::endl;
    Processor processor;
    Signal SignalOutput = processor.toProcess(signalInput);
    std::cout << "Output Signal: " << SignalOutput.text() << std::endl;
}

以上几种输出结果均相同:

如有错误,欢迎大家批评与指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值