2015-06-30 139 views
1

首先,我知道這不是最好的方式來做到這一點,我只是看它應該如何完成。我創建了一個名爲BORD類,其中包含一個成員C++使用unique_ptr的字符數組

 std::unique_ptr<std::unique_ptr<char>[] > char_bord; 

這應該是正確的語法,然後我嘗試在構造函數初始化此:

bord::bord():char_bord(new std::unique_ptr<char>[10]) 
{ 
    //char_bord=new std::unique_ptr<char>[10]; //This did not seem to work aswell. 
    for(int i=0;i<10;i++) 
     char_bord[i]=new std::unique_ptr<char>[](new char[10]); 
    return; 
} 

這將導致錯誤的下面堆,我沒有設法破譯。

[email protected]:~/Git/Board/lib$ g++ -std=c++0x bord.c 
In file included from bord.c:1:0: 
bord.h:20:1: error: new types may not be defined in a return type 
class bord 
^ 
bord.h:20:1: note: (perhaps a semicolon is missing after the definition of ‘bord’) 
bord.c:3:12: error: return type specification for constructor invalid 
bord::bord():char_bord(new std::unique_ptr<char>[10]) 
      ^
bord.c: In constructor ‘bord::bord()’: 
bord.c:7:46: error: expected primary-expression before ‘]’ token 
     char_bord[i]=new std::unique_ptr<char>[](new char[10]); 
              ^
bord.c:7:60: error: parenthesized initializer in array new [-fpermissive] 
     char_bord[i]=new std::unique_ptr<char>[](new char[10]); 
                  ^
bord.c:7:19: error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<char>’ and ‘std::unique_ptr<char>*’) 
     char_bord[i]=new std::unique_ptr<char>[](new char[10]); 
       ^
bord.c:7:19: note: candidates are: 
In file included from /usr/include/c++/4.9/memory:81:0, 
       from bord.h:19, 
       from bord.c:1: 
/usr/include/c++/4.9/bits/unique_ptr.h:249:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = char; _Dp = std::default_delete<char>] 
     operator=(unique_ptr&& __u) noexcept 
    ^
/usr/include/c++/4.9/bits/unique_ptr.h:249:7: note: no known conversion for argument 1 from ‘std::unique_ptr<char>*’ to ‘std::unique_ptr<char>&&’ 
/usr/include/c++/4.9/bits/unique_ptr.h:269:2: note: template<class _Up, class _Ep> typename std::enable_if<std::__and_<std::is_convertible<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Tp, _Dp>::_Pointer::type>, std::__not_<std::is_array<_Up> > >::value, std::unique_ptr<_Tp, _Dp>&>::type std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = _Up; _Ep = _Ep; _Tp = char; _Dp = std::default_delete<char>] 
    operator=(unique_ptr<_Up, _Ep>&& __u) noexcept 
^
/usr/include/c++/4.9/bits/unique_ptr.h:269:2: note: template argument deduction/substitution failed: 
bord.c:7:19: note: mismatched types ‘std::unique_ptr<_Tp, _Dp>’ and ‘std::unique_ptr<char>*’ 
     char_bord[i]=new std::unique_ptr<char>[](new char[10]); 
       ^
In file included from /usr/include/c++/4.9/memory:81:0, 
       from bord.h:19, 
       from bord.c:1: 
/usr/include/c++/4.9/bits/unique_ptr.h:278:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::nullptr_t) [with _Tp = char; _Dp = std::default_delete<char>; std::nullptr_t = std::nullptr_t] 
     operator=(nullptr_t) noexcept 
    ^
/usr/include/c++/4.9/bits/unique_ptr.h:278:7: note: no known conversion for argument 1 from ‘std::unique_ptr<char>*’ to ‘std::nullptr_t’ 

我做錯了什麼,假設我做錯了什麼。

+1

爲什麼不簡單地使用'std :: vector '? –

+0

我知道這是要走的路,我只是想知道爲什麼這不起作用。 – jelmew

+0

什麼'bord :: bord():char_bord'應該聲明?它是'bord :: bord :: char_bord'(如果你還有一個'bord'命名空間)或者簡單地'bord :: char_bord'(如果你的'bord'類在全局命名空間中)?哦,是的... btw ...爲什麼要用數組而不是使用C++容器? –

回答

3

下面是一些代碼,演示了什麼,我想你想:

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <memory> 

using namespace std; 

using array_ptr_type = std::unique_ptr<char[]>; 
using array_of_arrays_type = std::unique_ptr<array_ptr_type[]>; 

auto main() -> int 
{ 
    auto x = array_ptr_type(new char[10]); 
    auto y = array_ptr_type(new char[10]); 
    for (int i = 0 ; i < 10 ; ++i) 
    { 
     x[i] = char('0' + i); 
     y[i] = char('0' + 9 - i); 
    } 

    auto pxy = array_of_arrays_type(new array_ptr_type[2]); 
    pxy[0] = move(x); 
    pxy[1] = move(y); 

    for (int i = 0 ; i < 2 ; ++i) { 
     copy(&pxy[i][0], &pxy[i][10], ostream_iterator<char>(cout, ", ")); 
     cout << endl; 
    } 
    return 0; 
} 

預期輸出:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 

當然,如你所知,這一切都不建議 - vector<vector<char>>會很多更清潔,更易於維護。

+3

嗨,謝謝,那正是我想知道的,它將如何完成。事實上,回到更合理的矢量>。謝謝你回答我的好奇心。 – jelmew

2

你必須使用專門:

std::unique_ptr<char[]> chars(new char[1024]); 

這是因爲std::unique_ptr不支持定製刪除作爲std::shared_ptr確實(在此寫作風格)。

std::unique_ptr使用std::default_delete作爲刪除者。不久,如果您指定參數類型爲class T它將使用默認delete,但如果您編寫class T[](在此專業化)std::unique_ptr將使用delete[]

但是最好使用一些容器而不是c風格的數組。

+0

我kkow我應該使用一個容器。你能否詳細說明你的答案?它對我來說並不完全清楚。這只是一個智能指針,現在指向一個愚蠢的指針列表? – jelmew

+0

什麼是'std :: unique_ptr'和其他智能指針的用法?只是在超出範圍時正確刪除指針,或者它的引用計數爲零。你的'std :: unique_ptr []>是爲了什麼?當你想要刪除'unique_ptr'時......我甚至無法描述那些無意義的代碼。如果你想製作一個智能指針到字符數組 - 使用一個智能指針作爲數組。否則我不明白你想做什麼。 –

+0

這......在技術上是正確的,但並不能解釋OP在他的問題中遇到的所有編譯器錯誤。 – Puppy