【问题标题】:Error when assigning Array in Constructor在构造函数中分配数组时出错
【发布时间】:2012-12-01 02:15:41
【问题描述】:

这是我面临的一个奇怪问题 - 考虑到我生疏的 C++ 技能,这可能是一些超基本的问题,但我仍然感到困惑:

  • 我有课
  • 我们在这个类中还有一个unsigned long longs 数组——我们称之为arr

我的班级界面:

typedef unsigned long long U64;

class DQClass
{
    public:
        DQClass (void);
        virtual ~DQClass (void);

        U64 arr[12];
};

现在说到实现……

测试 1(有效):

DQClass::DQClass (void)
{
        this->arr[0] = 0x8100000000000000ULL;
        this->arr[1] = 0x4200000000000000ULL;

        // and so on..
}

测试 2(这不是):

DQClass::DQClass (void)
{
    this->arr = 
    {
        0x8100000000000000ULL,
        0x4200000000000000ULL,
        0x2400000000000000ULL,
        0x1000000000000000ULL,
        0x0800000000000000ULL,
        0x00FF000000000000ULL,
        FLIPV(0x8100000000000000ULL),
        FLIPV(0x4200000000000000ULL),
        FLIPV(0x2400000000000000ULL),
        FLIPV(0x1000000000000000ULL),
        FLIPV(0x0800000000000000ULL),
        FLIPV(0x00FF000000000000ULL)
    };
}

错误:

dqclass.cpp: In constructor ‘DQClass::DQClass()’:
dqclass.cpp:28: error: expected primary-expression before ‘{’ token
dqclass.cpp:28: error: expected `;' before ‘{’ token

为什么这不起作用?它不应该以与例如相同的方式工作吗? U64 someArr[12] = {0,1,2,3,4,5,6,7,8,9,10,11}会吗?

有什么想法吗?

【问题讨论】:

  • 如果将{ 移动到与= 相同的行怎么办?
  • @NahumLitvin 如果这样的方法有效,我会感到非常惊讶......不,它没有。
  • 数组在 C++ 中被破坏(因为它们在 C 中被破坏)。这就是为什么发明了 std::vectorstd::array 这样的东西。

标签: c++ c arrays gcc constructor


【解决方案1】:

数组不能像那样(或任何其他方式)分配,只能初始化:

 // sorry for bad formatting
DQClass::DQClass (void)
: arr(
    {
        0x8100000000000000ULL,
        0x4200000000000000ULL,
        0x2400000000000000ULL,
        0x1000000000000000ULL,
        0x0800000000000000ULL,
        0x00FF000000000000ULL,
        FLIPV(0x8100000000000000ULL),
        FLIPV(0x4200000000000000ULL),
        FLIPV(0x2400000000000000ULL),
        FLIPV(0x1000000000000000ULL),
        FLIPV(0x0800000000000000ULL),
        FLIPV(0x00FF000000000000ULL)
    }) {
}

使用构造函数初始化列表。


你也可以使用std::array:

std::array<U64, 12> arr;

// ...

this->arr = 
    {{
        0x8100000000000000ULL,
        0x4200000000000000ULL,
        0x2400000000000000ULL,
        0x1000000000000000ULL,
        0x0800000000000000ULL,
        0x00FF000000000000ULL,
        FLIPV(0x8100000000000000ULL),
        FLIPV(0x4200000000000000ULL),
        FLIPV(0x2400000000000000ULL),
        FLIPV(0x1000000000000000ULL),
        FLIPV(0x0800000000000000ULL),
        FLIPV(0x00FF000000000000ULL)
    }};

【讨论】:

  • 我不太确定你在第一段代码中要表达什么...请向我解释为什么U64 someArr[12] = {0,1,2,3,4,5,6,7,8,9,10,11} 确实有效?
  • @Dr.Kameleon 初始化不同于赋值。数组有愚蠢的行为,所以我不能给你一个很好的理由为什么不能分配数组。只需将std::array 用于此类目的。
  • @Dr.Kameleon 也许这会有所帮助stackoverflow.com/questions/3437110/…
  • 好的,这是另一个有趣的问题:我决定尝试std::array 方式。在尝试#include &lt;array&gt; 时,我得到了error: array: No such file or directoryISO C++ forbids declaration of ‘array’ with no type。 (提示:在 Mac OS X 1.6.8 中使用g++
  • @Dr.Kameleon 您需要一个支持 C++11 的相当新的版本。你也可以试试boost::array 这是std::array 的基础。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2019-08-12
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
相关资源
最近更新 更多