当前位置:  开发笔记 > 编程语言 > 正文

C++字符串,可以为NULL

如何解决《C++字符串,可以为NULL》经验,为你挑选了3个好方法。

我习惯在我的C++应用程序中传递这样的字符串:

void foo(const std::string& input)
{
  std::cout << input.size() << std::endl;
}

void bar()
{
  foo("stackoverflow");
}

现在我有一个我希望字符串为NULL的情况:

void baz()
{
  foo("stackoverflow");
  foo(NULL); // very bad with foo implementation above
}

我可以foo改为:

void foo(const std::string* input)
{
  // TODO: support NULL input
  std::cout << input->size() << std::endl;
}

但是为了传递一个字符串文字或复制一个char*实现,foo我需要写这样的东西:

void bar()
{
  string input("hi"); // annoying temporary
  foo(&input);
  foo(NULL);  // will work as long as foo handles NULL properly
}

我开始考虑继承std::string和添加null属性,但我不确定这是个好主意.也许最好简单地使用一个const char*字符串作为可以为NULL的参数,但是如果我想保存字符串的副本(或NULL)而不必自己管理它的内存呢?(请参阅使用C风格字符串有哪些缺点?等)

任何聪明的解决方案?



1> jalf..:

如果希望类型为null,则将其设为指针.传递字符串指针而不是引用,因为这正是指针可以做的,并且引用不能.引用始终指向同一个有效对象.指针可以设置为null,或者重新指向另一个对象.因此,如果你需要指针可以做的事情,使用指针.

或者,使用boost :: optional,它允许更类型安全的方式来指定"此变量可能包含或不包含值".

或者,当然,更改语义,以便您使用空字符串而不是null,传递一个单独的bool参数,指定字符串是否可用,或重构,因此您首先不需要它.



2> eplawless..:

功能超载救援......

void foo( const std::string& input )
{
    std::cout << input << std::endl;

    // do more things ...
}

void foo( const char* input )
{
    if ( input != NULL ) foo( std::string(input) );
}

这将接受c样式的char数组和std :: strings,并且如果传入字符串文字或char数组,将在堆栈上产生额外的开销,但允许您将实现保留在一个位置并保持良好的语法.



3> Max Lybbert..:

就个人而言,我会改变语义来传递空的std :: strings而不是NULL:

void foo(const std::string& input)
{
    if (!input.empty())
        std::cout << input.size() << std::endl;
}

void bar()
{
      foo("");
}

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有