那总是让我对C++语言感兴趣。随着“const”标识符的出现,应该替换为使用#define语句声明常量。但是正如我说要使用它们一样,我最终陷入了const char到char转换错误的疯狂之中。

最近,我说过要像在Java中那样在类常量中进行操作。因此,我决定声明这样的内容。

private: const static int NB_FIELD = 22;

这很完美。返回int的函数可以返回“const int”,而不会出现任何问题。

但是现在,如果我尝试对这样的字符串执行相同的操作:
private: static const char ERRORSTR [ 6 ];

其中包含字符串“Error”,它将生成类似此函数的const char到char转换问题。
char* EnhancedSQLobject::get_SQLname ( int index )
{
   if ( index < p_nb_field && index >= 0 )
      return ( p_SQLfield_ptr [ index ] . SQLname)

   return ( ERRORSTR );

}

现在有人会说更改const char *的返回值,但是我不能这样做,因为如果索引有效,它将返回一个非const变量,但是如果索引无效,它将返回一个常量错误字符串。

因此,我的选择是使错误字符串非恒定,或者使用#define语句创建一个常数。我记得很久以前曾试图将所有内容都定义为const char,但最终它在转换链中的其他位置爆炸了。使使用普通字符变得更容易(String类对我来说不是一个选择)

这很荒谬,为什么实现仅对部分变量类型起作用的功能。我认为这与事实有关,事实是字符串实际上是字符表,因此它可能返回指针而不是值。

最佳答案

在一种情况下,您正在谈论将const int转换为int,而在另一种情况下,您正在将const char*转换为char*。这些实际上是不同的情况,应该采取不同的行为,因为后者添加了一个间接级别(指针)。您绝对可以将const char转换为char,但这不是您要执行的操作。

考虑以下错误代码:

const int i = 50;
int j = i;
int* p = &i; // ERROR

我尝试做int j = i;,那很好。原始i对象仍为const,并且j对象的值与i相同。但是,如果我尝试执行int* p = &i;,就会遇到问题。如果可以编译,即使它告诉我们指向非const p,我们也将int指向一个const int。这将使我们能够通过指针i修改const对象p -非常糟糕。

您在这里只有char,情况也一样。 char中的所有ERRORSTR都是const。然后,您将无法返回指向任何char*char,因为那样会撒谎。指针不是指向非常量char,而是指向const char。

在这方面intchar的行为没有任何不同。

但是,我认为您只是因为界面设计不佳而进入了这个困境。当找不到“SQLname”(无论是什么)时,为什么函数返回一个特殊字符串?例如,如果字符串“Error”实际上是有效名称怎么办?函数的调用者将如何区分?我认为如果您的函数无法执行get_SQLname的操作(也就是说,它无法获得名称),则应引发异常。

最重要的是,您应该使用std::string而不是C风格的char*

10-07 13:00
查看更多