前言
之前学过c++语法,基本的语法还略微记得。项目中有了需求,要用c++来实现。撸码前我想的问题是怎样组织c++文件,c++的工程项目规范是什么,最关心的是c++工程是怎样解决解耦合,提高代码复用性和健壮性的。由于是新手,索性就学c++新特性,所以选择了>=c++11。平时一般用java和python,都有各自的import和包管理机制,c++也有对应的namespace。
namespace实验
一共三个文件:main.cpp, model_a.h, model_a.cpp
组织关系是,model_a为模型类或者utils类,里面有其方法,.cpp为实现文件,main为主文件。model_a中有一个变量 varA,有两个函数。
model_a.h
// ModelA.h
#include<vector>
#ifndef MODELA_H
#define MODELA_H
namespace modela{
int varA = 10;
using std::vector; //by this, don't need to write std::vector in this scope, just use vector
double maf1(const vector<double>& data);
double maf2(const vector<double>& data);
}
#endif
model_a.cpp
#include<iostream>
#include<vector>
#include"ModelA.h"
using namespace std;
double modela::maf1(const vector<double>& data){
modela::varA++;
cout<<"this is maf1, print from modela.cpp, varA++ then varA="<<modela::varA<<endl;
//cout<<"this is maf1(), print from modela.cpp."<<endl;
return 10.0;
}
double modela::maf2(const vector<double>& data){
cout<<"this is maf2, print from modela.cpp, now varA="<<modela::varA<<endl;
modela::varA++;
cout<<"this is maf2, print from modela.cpp, varA ++, now varA="<<modela::varA<<endl;
//cout<<"this is maf2(), print from modela.cpp."<<endl;
return 10.0;
}
main.cpp
#include<iostream>
#include"ModelA.h"
using namespace std;
int main(){
vector<double> data(10);
modela::maf1(data);
modela::maf2(data);
cout<<"call modela::varA: from main, varA="<<modela::varA<<endl;
modela::maf1(data);
return 0;
}
结果:
上述文件编译通过,链接时出错,说varA定义了两次,将varA定义为 static后编译链接通过。原因可能是:static在编译时就在内存静态区域进行了初始化,非static变量,在include的时候会在多个文件都进行初始化,所以提示重复定义。
varA在外部调用的时候,每次都是初始值10,mdoel_a自己调用时能够保存历史更改值。
c++可以通过namespace来管理各个模块,但是命名空间不能使用‘.’号定义,如:namespace io.github.model{}
会报错。