在写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;
}
以上几种输出结果均相同:
如有错误,欢迎大家批评与指正!