【问题标题】:C++ Invalid ConversionC++ 无效转换
【发布时间】:2011-05-29 18:39:50
【问题描述】:

以下代码产生编译错误invalid conversion from 'const char*' to 'char*'ptrInputFileNameptrFileName 都被声明为 const char*。关于如何编译它的任何建议?谢谢。

TextInputBuffer::TextInputBuffer(const char *ptrInputFileName)
    : ptrFileName(new char[strlen(ptrInputFileName) + 1])
{
    //--Copy the file name.
    std::strcpy(ptrFileName, ptrInputFileName);

【问题讨论】:

    标签: c++ g++ compiler-errors


    【解决方案1】:

    显然,您不能复制到由 const * 指向的内容中 - 删除 const,如果这会导致调用构造函数出现问题,那么您所做的事情在语义上是无效的。

    此外,您使用伪匈牙利语会使代码难以阅读。去掉 ptr 前缀,缩短名称。

    【讨论】:

    • 这些名称前缀的负值需要得到更广泛的认可。
    • 如果您有前缀,则更容易查看是否需要在大文件中打印 ptr 或 *ptr。如果声明一个指向 a 的指针,其中包含 5,那么打印 *ptr 会打印 5 和打印 ptr 会打印 0xbce8f4 有很大的不同。
    • @Neil:您对 Apps Hungarian 的看法与对 Systems Hungarian 的看法是否相同?
    • @NeilButterworth:我相信你误解了比尔。 “应用程序”与“系统”是 unsafe_user_input 和 str_user_input 之间的区别。 “不安全”或“行”(而不是“col”)是变量的“类型”(参见“类别”),但被误解为与语言的类型系统相对应。这种误解被广泛传播,并且是大多数人所知道的。 :(
    • @dunsmoreb:即使是发明了匈牙利语的微软,现在也不鼓励使用匈牙利符号:msdn.microsoft.com/en-us/library/ms229045.aspx
    【解决方案2】:

    strcpy 将目标地址作为非常量指针char* 并且ptrFileNameconst char*。不可能进行隐式转换,我不建议进行显式转换。只需将ptrFileName 设为非常量即可。

    【讨论】:

      【解决方案3】:

      使用 std::string。

      struct TextInputBuffer {
        TextInputBuffer(const char *filename)
        : _filename(filename)
        {}
      
        // Explicit delete not even required as it would have been
        // when you used new.
      
      private:
        std::string _filename;
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多