2017-01-30 10 views
-2

私の家庭では、ダイナミックな配列やその他の関数の構築を依頼しています。私は、問題の残りの部分を完了するために管理してきましたが、私は関係なく、アレイは、アレイ内のすべての値が意志でどのように大きなD[0]=11D[1]=12を、設定しない場合、現在、私は理解していない1つのバグ...C++動的配列のインデックスと容量の問題

があります12になると、その容量は12となります。

これは私が以下に関連すると考えているコードです。私はより多くの要求を提供します。

OUTPUT

TEST.CPP @someprogrammerdudeの要求によって

int main() 
{ 
    dynarr<int> D(15); 
    std::cout << "The capacity of D is " << D.getCapacity() << std::endl; 
    D[0] = 11; 
    D[1] = 12; 
    std::cout << "D[0] = " << D[0] << std::endl; //12 
    std::cout << "D[1] = " << D[1] << std::endl; //12 
    std::cout << "The capacity of D is " << D.getCapacity() << std::endl; //12 
    return 0; 
} 

余分なコード:

template <class dynElem> 
dynElem & dynarr<dynElem>::operator[](int ndx) throw(InvalidIndex) 
{ 
    if (ndx < 0) { 
     throw InvalidIndex("Array Index is negative"); 
    } 
    else if (ndx > capacity) { 
     throw InvalidIndex("Array Index is too large"); 
    } 
} 

template <class dynElem> 
int dynarr<dynElem>::getCapacity() 
{ 
    return capacity; 
} 
+5

それはあなたが使用する方法を学習する必要がある場合がありますように聞こえますデバッガを使用してコードをステップ実行します。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+2

_dynamic配列_を作成する慣用方法C++は必要な型の 'std :: vector'を使います。 –

+0

インデックス演算子 'operator []'と 'dynElement'クラスと' getCapacity'関数を表示してください。要するに、[最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –

答えて

0

私はあなたのコードが実際に警告なしでコンパイルすることを驚いて(私のコンパイラは叫ぶだろう私に)。あなたはoperator[]から値を返すのを忘れました。あなたがしなければならないことがここにあります。

template <class dynElem> 
dynElem & dynarr<dynElem>::operator[](int ndx) throw(InvalidIndex) 
{ 
    if (ndx < 0) { 
     throw InvalidIndex("Array Index is negative"); 
    } 
    else if (ndx > capacity) { 
     throw InvalidIndex("Array Index is too large"); 
    } 
    return A[ndx]; // here we return the element. 
} 

ところで、現代のC++では、あなたは(あなたがstd::vectorを再実装することはないという事実から離れて)少し異なり、これをコーディングします。

template<typename T> 
class dynarr { 
    std::size_t _capacity =0; // set default values for initialisation 
    std::unique_ptr<T[]> ptr; // don't worry about de-allocation 
    public: 
    dynarr() = default;   // no need to define a destructor either 
    dynarr(std::size_t N) 
     : _capacity(N), ptr(new T[N]) {} 
    dynarr(const dynarr&); 
    dynarr& operator=(const dynarr&); 
    T& operator[](size_t i);    // no need for throw() 
    T const& operator[](size_t i) const; // version for const access 
    size_t capacity() const noexcept 
     { return _capacity; } 
    void reserve(size_t new_capacity); 
};