首页 > 解决方案 > 有没有一种干净的方法可以从 getenv 调用中实例化一个 const std::string 私有成员

问题描述

我有一个类需要获取环境变量并在各种处理中使用它。它应该是常量。我对 constness 的理解是它必须在初始化时实例化。所以这样的事情会起作用

class C 
{
public:
  C() : idFromEnv(getenv("ENV")) {}

private:
  std::string idFromEnv;

};

但这不是一种安全的方法,因为如果字符串为空,则会引发异常。我认为可能有一种方法可以结合三元运算符来做到这一点。像这样的东西,但这真的很难看:

class C
{
  public:
  C() : idFromEnv(getenv("ENV") ? getenv("ENV") : "UNKNOWN") 
  {
      std::cout << idFromEnv << "\n";
  }

  private:
  const std::string idFromEnv;
};

我不使用那个。有人有更优雅的建议吗?


根据建议,我尝试了这个。它确实有效。不完全是我的想法。

class C 
{
    public:
    
    inline const std::string getEnvString(const char *env) 
    {
        char* cStr = getenv(env);
        return(std::string(cStr ? cStr : "UNKNOWN"));
    }
    
    C() : idFromEnv(getEnvString("ENV"))
    {
        std::cout << idFromEnv << "\n";
    }
    
    private:
    const std::string idFromEnv;
};

标签: c++stringenvironment-variables

解决方案


我对 constness 的理解是它必须在初始化时实例化。

您提供的第一个示例中没有问题,因此如果您不想在构造函数的初始化列表中进行初始化,const则无需进行初始化。idFromEnv可以在构造函数的主体中分配它,例如:

class C 
{
public:
  C()
  {
    char* cStr = getenv("ENV");
    idFromEnv = cStr ? cStr : "UNKNOWN";
  }

private:
  std::string idFromEnv;
};

但是,如果idFromEnv需要const,那么是的,您必须在构造函数的初始化列表中对其进行初始化。因此,使用辅助函数来包装额外的getenv()处理确实是您最好的选择,例如:

std::string getenvstr(const char *env)
{
  char* cStr = getenv(env);
  return cStr ? cStr : "UNKNOWN";
}

class C 
{
public:
  C() : idFromEnv(getenvstr("ENV")) {}

private:
  const std::string idFromEnv;
};

推荐阅读