C++之map如何实例化类对象(一百九十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解std::map如何实例化ComponentLoader对象。

2.应用实例

v1.0 实例化map类

#include 
#include 
#include 
#include 
#include 

using namespace std;

struct ComponentModule {
public:
  void init(std::string libPath){
    printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,libPath.c_str());
  }
};

struct ComponentLoader {
public:
  ComponentLoader(std::string libPath) : mLibPath(libPath) {
    printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,mLibPath.c_str());
  }

  void fetchModule() {
    std::shared_ptr<ComponentModule> localModule = std::make_shared<ComponentModule>();
    localModule->init(mLibPath);
  }

  std::string mLibPath;
};

int main(){
  //map容器,第一个参数string,第二个是ComponentLoader类.
  std::map<string, ComponentLoader> mComponents;

  //v1.0
  //auto emplace = [&](const char *libPath) {

  //v2.0 function定义
  function<void (const char*)> emplace = [&](const char *libPath) {
    //构造函数ComponentLoader实例化,emplace插入键值对
    mComponents.emplace(libPath, libPath);
  };

  emplace("libcodec2_soft_aacdec.so");
  emplace("libcodec2_soft_aacenc.so");
  emplace("libcodec2_soft_amrnbenc.so");
}

注释:
mComponents.emplace(libPath, libPath)插入key-value键值对,其实际形式可以写为:map
第一个字段就是string类型
第二个参数传入ComponentLoader类构造函数,它的构造函数实现

ComponentLoader(std::string libPath) : mLibPath(libPath) {
    printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,mLibPath.c_str());
  }

ComponentLoader构造函数初始化列表,将传入的libPath赋值给mLibPath成员函数。在可以调用fetchModule函数直接使用。

v2.0 实例化map类 + 遍历

#include 
#include 
#include 
#include 
#include 

using namespace std;

struct ComponentModule {
public:
  void init(std::string libPath){
    printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,libPath.c_str());
  }
};

struct ComponentLoader {
public:
  ComponentLoader(std::string libPath) : mLibPath(libPath) {
    printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,mLibPath.c_str());
  }

  void fetchModule() {
    std::shared_ptr<ComponentModule> localModule = std::make_shared<ComponentModule>();
    localModule->init(mLibPath);
  }

  std::string mLibPath;
};

int main(){
  //map容器,第一个参数string,第二个是ComponentLoader类.
  std::map<string, ComponentLoader> mComponents;

  //v1.0
  //auto emplace = [&](const char *libPath) {

  //v2.0 function定义
  function<void (const char*)> emplace = [&](const char *libPath) {
    //构造函数ComponentLoader实例化,emplace插入键值对
    mComponents.emplace(libPath, libPath);
  };

  emplace("libcodec2_soft_aacdec.so");
  emplace("libcodec2_soft_aacenc.so");
  emplace("libcodec2_soft_amrnbenc.so");

#if 0
  printf("\n");
  //v1.0使用auto遍历map
  for (auto &pathAndLoader : mComponents) {
    const string &path = pathAndLoader.first;
    ComponentLoader &loader = pathAndLoader.second;
    loader.fetchModule();
  }
  printf("\n");

  //v2.0使用pair遍历map
  for (std::pair<const string, ComponentLoader> &pathAndLoader : mComponents) {
    const string &path = pathAndLoader.first;
    ComponentLoader &loader = pathAndLoader.second;

    loader.fetchModule();
  }

  printf("\n");
  //v3.0使用迭代器遍历map
  std::map<std::string, ComponentLoader>::iterator it;
 for (it = mComponents.begin(); it != mComponents.end(); it++) {
   //std::string key = it->first;
   //ComponentLoader &value = it->second;

   printf("key = %s\n",it->first.c_str());
   it->second.fetchModule();
 }
#endif

}

你可能感兴趣的:(C++入门系列,c++,开发语言)