【问题标题】:C++ Initializing Array of PointersC++ 初始化指针数组
【发布时间】:2015-10-14 05:21:58
【问题描述】:

我知道用指针你可以做到这一点:

T * myPtr = 0;

将指针设置为 NULL 值。但是,当我尝试这样做时:

T * myPtrArray[2] = {0, 0};

我收到“预期表达式”语法错误。为什么?

注意,我使用的是 g++,上面的代码出现在类构造函数中:

template <class T>
    RBTree<T>::RBTree() {
        m_Data = T();
        m_Children = {0, 0};
        m_Parent = 0;
        m_Color = BLACK;
    }

有问题的类成员声明为:

T m_Data;
RBTree<T> * m_Children[2];
RBTree<T> * m_Parent;
bool m_Color;

【问题讨论】:

  • 什么编译器?使用 g++、clang 和 msvc 为我工作。
  • 它应该可以工作。任何上下文?
  • 请显示实际的错误信息。
  • 这是赋值,不是初始化。有区别。数组不支持赋值。
  • 我认为因为它在构造函数中,所以它会被认为是初始化。那么这是错的吗?

标签: c++ pointers array-initialization


【解决方案1】:

T * myPtrArray[2] = {0, 0}; 的形式称为aggregate initialization。它在分配中没有对应物,所以写

T * myPtrArray[2];
myPtrArray = {0, 0};

无效。

在类构造的情况下,聚合初始化在c++98/03中是不可用的。

如果你的编译器支持 c++11 标准,你可以使用统一的初始化语法。在您的示例中,有两种方法可以初始化 m_Children

#1

在构造函数中:

template <class T>
RBTree<T>::RBTree(): m_Children {0, 0} /* other init here */ {

}

#2

在类成员声明期间:

T m_Data;
RBTree<T> * m_Children[2] {0, 0};
RBTree<T> * m_Parent;
bool m_Color;

【讨论】:

  • #1 在 C++11 之前不受支持。但是m_children() 是,并且可能是更好的选择,因为 ti 不依赖于数组中的元素数量。
  • ITYM #2 不受支持(在类成员声明期间)。
【解决方案2】:

从 C++11 开始,您可以使用 nullptr 代替 0。首选使用nullptr,因为它是指针而不是整数。然后,你可以这样做:

T * myPtrArray[2] = {nullptr, nullptr};

无论如何,你的代码在我的编译器上运行良好,你可以看到一个使用0nullptr 的示例,它编译时没有错误on ideone

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多