为什么我不能在这个唯一的指针中声明一个新的字符数组?



我正在尝试为对象创建一个运行时id。我已经用一个普通的指针完成了,但是我需要让它用一个唯一的指针工作。为什么我不能在唯一指针中使用new?我得到了

错误E0079期望一个类型说明符。

这一行:

unique_ptr<char> idPtr(new char[DEVICE_ID_LENGTH]);

这是完整的文件:

#pragma once
#include <iostream>
#include <string>
#include <memory>
#include <utility>

using namespace std;
constexpr auto DEVICE_ID_LENGTH = 10;
class Widget
{
public:
//constructor
explicit Widget(int nbr);
~Widget();

void getID(char* s, const int len);

std::string WhatIAm; 
//char* idPtr = new char[DEVICE_ID_LENGTH];  //This needs to be initialized by the constructor

unique_ptr<char> idPtr(new char[DEVICE_ID_LENGTH]);
int getSize();
private:
int widgetSize;
int widgetNumber;
};

来自cppreference关于默认成员初始化式(粗体强调我的):

非静态数据成员可以用以下两种方式初始化:

  1. 通过默认成员初始化式,它是一个大括号或等于初始化式在构造函数的成员初始化列表中省略该成员时使用。

请注意,这里不允许像代码中那样使用圆括号初始化默认成员。相反,它被解释为成员函数声明,因此在开始括号参数列表之后是预期的,但是您提供new-expression,因此您的编译器正确地抱怨,虽然您的参数列表似乎不是空的,但它没有看到第一个参数的类型说明符。

还请注意,您需要unique_ptr<char[]>,而不是unique_ptr<char>,来管理由new表达式的数组形式创建的数组,以便它的析构函数知道它必须调用delete[],而不是delete,用于保存指针。

因此,要执行默认成员初始化,你可以使用,例如,像这样的带括号的初始化式:

unique_ptr<char[]> idPtr{new char[DEVICE_ID_LENGTH]};

注:using namespace std;通常是不好的做法,尤其是头文件中的。看到这里。

最新更新