類似於java的Object的c++實現

java裏面Object是所有對象的父類,其作爲參數可以傳入任何類型,c++沒有該對象,不過通過qt中的源碼發現,其簡易實現方法,當然不像java中的Object那麼萬能,c++高級用法還不太會,暫時用這種記錄一下:

代碼如下:

param.h

//
// Created by wocan23 on 2019/9/23.
//

#ifndef TEXT_PARAM_H
#define TEXT_PARAM_H

#include <iostream>
using  namespace std;


class Param {

public:
    enum ParamType{
        STRING, INT
    };
    union Private{
        char* argS;
        int argI;
    }aPrivate;
    Param();
    Param(const string& par);
    Param(const int& par);


    int toInt() const;
    string toString()const;

    const ParamType getType()const;

private:
    ParamType paramType;
};


#endif //TEXT_PARAM_H

param.cpp

//
// Created by wocan23 on 2019/9/23.
//

#include "Param.h"

Param::Param() {

}

Param::Param(const int& par) {
    this->aPrivate.argI = par;
    this->paramType = INT;
}

Param::Param(const string& par) {
    const char * ptr = par.c_str();
    this->aPrivate.argS = (char*)ptr;
    this->paramType = STRING;
}

int Param::toInt() const{
    return this->aPrivate.argI;
}

string Param::toString() const{
    return this->aPrivate.argS;
}

const Param::ParamType Param::getType()const {
    return this->paramType;
};

main.cpp

void printInt(int a){
    cout << "int : " << a << endl;
}

void printStr(string& b){
    cout << "string : " << b << endl;
}

void testP(const Param& param){
    Param::ParamType type= param.getType();
    switch (type){
        case Param::ParamType::INT:
            printInt(param.toInt());
            break;
        case Param::ParamType::STRING:
            string str = param.toString();
            printStr(str);
            break;
    }

}

void testPS(Param param[],int count){

    for (int i = 0; i < count; ++i)
    {
        cout << "testP" << endl;
        Param pi = param[i];
        testP(pi);
    }

}

int main() {
    string a = "a";
    int b = 1;
    testP(a);
    testP(1);

    string c = "c";
    Param params[4];
    params[0] = a;
    params[1] = c;
    params[2] = b;
    params[3] = c;
    testPS(params,4);
}

發現testP方法可以傳入string和int,如果想支持其他類型,那麼只需要擴充聯合體及相應的構造函數及成員函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章