Arduino C++ Class 類別 傳遞 研究

門禁系統越寫越大,加上指紋識別
雖然  Arduino IDE 可以新增另一個檔案放分類的 Function,也算好分類
但是考慮以後寫到其他系統也需要用到差不多的功能
也差不多該包起來,變成一個Class 類別
所以就研究一下類別寫法

Arduino for Visual Studio
是最方便的
在 Arduino for VS的專案:"方案總管"內按滑鼠右鍵選"加入" 就會讓你挑

等我自以為的將所有功能分類
共分成 RFC522 , WebServer , EPRom ...幾個Class 加完後
 麻煩的事來了
Arduino for VS 顯示沒錯誤....但編譯就是記憶體錯誤
拿 Arduino IDE 來開這專案 再編譯
Arduino IDE 就跑出一堆錯誤...
所以編寫程式 好用是 Arduino for VS 
問題查不出來時再用 Arduino IDE 來看
*************************************************
但在用簡單的Class 測試除錯過程時 Arduino for VS 又都表現很好
我猜是因錯誤太多了Arduino for VS 懶得Show  呵!!
**********************************************
錯誤太多的問題在於 RFC522 會用到 EPROM 存取資料
WebServer 也會用到,各個類別 用來用去的
之前大家混在一起都是一家人 你用我的 我用你的 沒問題
分開成Class 之後就分得很清楚 不一樣了
所以不是 在主程式一開頭有宣告就好  
Arduino for VS 認為是OK 只是編譯不會過

但問題是怎麼將 A 類別 丟到 B類別內 用 (不是Copy 一份)
這就到了我對C 最感冒的"指標" 時間
******************************************
先開2個Class MyC1 MyC2
目的是 將 C1 丟給 C2  處理
測試搞清楚 *  &  .  -> 用法

MyC1.h
#ifndef _MYC1_h
#define _MYC1_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif

class MyC1Class
{
 protected:

 public:
	int A = 0;//這邊設一個變數 A
	void init();
};
extern MyC1Class MyC1;
#endif
MyC1.cpp
#include "MyC1.h"

void MyC1Class::init()
{
}
MyC1Class MyC1;
MyC2.h
#ifndef _MYC2_h
#define _MYC2_h 

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif
#include "MyC1.h" //要用到 C1
class MyC2Class
{
 protected:

	 
 public:
	int A = 0;//這邊也設一個變數 A
	MyC1Class *C3;//這邊設一個指標*接 讓所有這類別內 所有函式 都可處理
	void init();
	void Test(MyC1Class& C1);
	void TTT();
};

extern MyC2Class MyC2;

#endif

MyC2.cpp
#include "MyC2.h"
void MyC2Class::TTT()
{
 	C3->A++;
	A = C3->A;//指標用裏頭東西是 -> 不能用 .
}
void MyC2Class::init()
{
}
void MyC2Class::Test(MyC1Class& C1)
{
	C3 = &C1;//將收到 C1 引用 給 C3
	TTT();
}
主程式:
#include "MyC2.h"
#include "MyC1.h"

MyC1Class C1;//這邊跟C#觀念不同 一經宣告就佔有實體
MyC2Class C2;
MyC1Class *C3;//這邊跟C#還沒New 只是給個位址 指標

void setup()
{
	Serial.begin(115200);
	Serial.println("*************");
	Serial.println("*************");
	C3 = &C1;//將C1實體 "&引用" 給 C3 讓C3跟C1是相同位址

	C1.A = 10;//給 C1.A 一個值
	Serial.println(C1.A); //10
	C2.Test( C1 );//C1 丟給C2 處理
	C3->A = 20;//指標用裏頭東西是 -> 不能用 .

	Serial.println("*************");
	Serial.println(C1.A);//20
	Serial.println("*************");
	Serial.println(C2.A);//11
}

void loop()
{

  /* add main program code here */

}
  本想用 VS2017 開個 C++專案測試這問題, 但本人不是專門寫 C++ 不熟卡卡的...
所以還是用 Arduino C++ 就直接用Mini D1試
可能用久熟了 比用 C++專案測方便多了
就這樣搞清楚 類別參數 傳遞的方式.

留言

熱門文章