前言
之前學(xué)過c++語法,基本的語法還略微記得邑茄。項(xiàng)目中有了需求姨蝴,要用c++來實(shí)現(xiàn)。擼碼前我想的問題是怎樣組織c++文件肺缕,c++的工程項(xiàng)目規(guī)范是什么左医,最關(guān)心的是c++工程是怎樣解決解耦合,提高代碼復(fù)用性和健壯性的同木。由于是新手浮梢,索性就學(xué)c++新特性,所以選擇了>=c++11彤路。平時(shí)一般用java和python秕硝,都有各自的import和包管理機(jī)制,c++也有對(duì)應(yīng)的namespace洲尊。
namespace實(shí)驗(yàn)
一共三個(gè)文件:main.cpp, model_a.h, model_a.cpp
組織關(guān)系是远豺,model_a為模型類或者utils類,里面有其方法坞嘀,.cpp為實(shí)現(xiàn)文件躯护,main為主文件。model_a中有一個(gè)變量 varA丽涩,有兩個(gè)函數(shù)棺滞。
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;
}
結(jié)果:
上述文件編譯通過,鏈接時(shí)出錯(cuò)矢渊,說varA定義了兩次继准,將varA定義為 static后編譯鏈接通過。原因可能是:static在編譯時(shí)就在內(nèi)存靜態(tài)區(qū)域進(jìn)行了初始化矮男,非static變量移必,在include的時(shí)候會(huì)在多個(gè)文件都進(jìn)行初始化,所以提示重復(fù)定義昂灵。
varA在外部調(diào)用的時(shí)候,每次都是初始值10舞萄,mdoel_a自己調(diào)用時(shí)能夠保存歷史更改值眨补。
c++可以通過namespace來管理各個(gè)模塊,但是命名空間不能使用‘.’號(hào)定義倒脓,如:namespace io.github.model{}
會(huì)報(bào)錯(cuò)撑螺。