【问题标题】:Initializer list in constructor to initialize private const c string error构造函数中的初始化列表以初始化私有 const c 字符串错误
【发布时间】:2014-02-23 21:42:46
【问题描述】:

我班上的私人成员:

const char arr1[];
const char arr2[];

我的构造函数:

className(const char a[], const char b[])
   :arr1(a), arr2(b)
{

}

来自控制台窗口的错误信息是:

In constructor className::className(const char*, const char*):
error: incompatible types in assignment of const char* to const char [0]

请帮忙,我做错了什么?


顺便说一句,我找到了一个解决方案... 我使用指针作为我的私有成员变量,所以 *arr1 和 *arr2 并且有效。 :)

【问题讨论】:

  • C++ 不允许在没有明确大小的类中使用数组。
  • 如果您需要动态大小,请将类制作成模板,然后在构建它时设置大小。或者你可以 malloc 内存,然后在 thje 构造函数中复制数组,而不是使用初始化列表。

标签: c++ string constructor initializer-list


【解决方案1】:

您将您的成员声明为const char arr1[]。令我惊讶的是编译器甚至允许您进行该声明,因为它应该具有该形式的固定大小(例如const char arr1[512])。

根据你想做什么,你要么必须:

  1. 将您的成员声明为const char* arr1 -- 请注意,这不会复制字符串;或
  2. 使用字符串类(如std::string)和/或为类成员分配内存,然后复制

【讨论】:

  • 是的,在大多数情况下,#2 是要走的路,但它确实取决于一个人想要做什么。
【解决方案2】:

首先,你的编译器应该已经对成员的声明感到窒息了:

const char arr1[];
const char arr2[];

这是非法的 C++,作为类成员的数组需要说明它们的大小。

第二,const char p[],当用于函数声明时,字面意思是const char* p。也就是说,指向常量 char 的指针。数组不是指针,不要混淆两者。但是,当传递给函数时,它们衰减为指向它们的第一个元素的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2011-03-23
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多