亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

括號括起的初始化程序列表構造函數

括號括起的初始化程序列表構造函數

C++
夢里花落0921 2019-12-27 12:54:26
我有以下構造函數的類Phenotype:Phenotype(uint8 init[NUM_ITEMS]);我可以創建這樣的表型:uint8 data[] = {0,0,0,0,0};Phenotype p(data);但是當我嘗試創建一個這樣的錯誤消息:Phenotype p = {0,0,0,0,0};輸出:$ makeg++ -Wall -g main.cpp -std=c++0xmain.cpp: In function ‘int main(int, char**)’:main.cpp:109: error: no matching function for call to ‘Phenotype::Phenotype(<brace-enclosed initializer list>)’main.cpp:37: note: candidates are: Phenotype::Phenotype(uint8*)該錯誤似乎表明存在一種定義帶括號括起的初始化程序列表的構造函數的方法。有誰知道該怎么做?
查看完整描述

3 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

只能對聚合(數組和某些類。與流行的看法相反,這也適用于許多非莢)。編寫帶它們的構造函數是不可能的。


由于您將其標記為“ C ++ 0x”,因此這是可能的。神奇的詞是“ initializer-list構造函數”。這就像


Phenotype(std::initializer_list<uint8> c) {

  assert(c.size() <= std::size(m_array));

  std::copy(c.begin(), c.end(), m_array);

}


// used like

Phenotype p1{1, 2, 3};

Phenotype p2({1, 3, 2}); // works too

Phenotype p3(1, 2, 3); // doesn't work

但是,此類初始化將默認構造數組,然后使用賦值運算符。如果您追求速度和安全性(太多初始化器會導致編譯時錯誤?。?,那么您也可以將普通構造函數與可變參數模板一起使用。


不過,這可能比需要的通用(通常initializer_list完全足夠,特別是對于純整數)。它得益于完美的轉發,因此可以將右值參數移動到數組元素中


template<typename ...T>

Phenotype(T&&...t):m_array{ std::forward<T>(t)... } {


}


// used like

Phenotype p1{1, 2, 3}; 

Phenotype p2(1, 2, 3); // works too

Phenotype p3({1, 2, 3}); // doesn't work   

這是一個艱難的選擇!


編輯更正,最后一個也可以,因為我們沒有構造構造函數explicit,因此它可以使用的copy構造函數Phenotype,構造一個臨時Phenotype對象并將其復制到p3。但這不是我們真正希望的電話:)


查看完整回答
反對 回復 2019-12-27
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

在C ++ 0x中,您似乎可以為此創建一個構造函數。我自己對此沒有經驗,但是看起來它像稱為Initializer list-constructor。


容器可以實現如下的初始化列表構造函數:


template<class E> class vector {

public:

    vector (std::initializer_list<E> s) // initializer-list constructor

    {

        reserve(s.size());  // get the right amount of space

        uninitialized_copy(s.begin(), s.end(), elem);   // initialize elements (in elem[0:s.size()))

        sz = s.size();  // set vector size

    }


    // ... as before ...

};


查看完整回答
反對 回復 2019-12-27
?
森欄

TA貢獻1810條經驗 獲得超5個贊

您需要使用std :: initializer_list模板類型。例:


#include <iostream>

class X {

    public:

        X (std::initializer_list<int> list) {

        for (auto i = list.begin(); i != list.end(); i++) {

                std::cout << *i << std::endl;

            }

        }

};



int main () {

    X x = {1,2,3,4,5};

}


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 623 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號