2

このコードを GNU C++ コンパイラ (g++) でコンパイルしようとしていますが、うまくいかないようです。私は Vis Studio と Code::Blocks を使用しましたが、問題なく動作します。コンパイラが特定の点で異なることを認識しており、誰かが私のエラーを見つけるのを手伝ってくれるかどうか疑問に思っていました.

#include <iostream>
using namespace std;

template <class T>
class Array
{
    private:
        T *m_array;
        int m_size;
    public:
        Array();
        Array(Array& other);
        Array(int size);
        ~Array();
        void setValue(int index, T val);
        T getValue(int index);
        int getSize();
        Array &operator=(Array &other);
        Array &operator+(Array &other);
        Array &operator+(T val);
        inline friend ostream &operator<<(ostream &other, Array<T> arr)
        {
            for (int i = 0; i < arr.getSize(); i++)
            {
                other << arr.getValue(i) << " ";
            }
        }
};

template<class T>
Array<T>::Array()
{
    m_array =  NULL;
    m_size = 0;
}
template<class T>
Array<T>::Array(int size)
{
    m_size = size;
    m_array = new T[size];
}
template<class T>
Array<T>::Array(Array& other)
{
    *this = other;
}
template<class T>
Array<T>::~Array()
{
    delete[] m_array;
}
template<class T>
void Array<T>::setValue( int index, T val )
{
    m_array[index] = val;
}
template<class T>
T Array<T>::getValue( int index )
{
    return m_array[index];
}
template<class T>
Array<T> &Array<T>::operator=( Array& other )
{
    if (m_array != NULL)
        delete[] m_array;

    m_size = other.getSize();

    m_array = new T[m_size];

    for (int i = 0; i < other.getSize(); i++)
    {
        m_array[i] = other.getValue(i);
    }

    return *this;
}
template<class T>
Array<T> &Array<T>::operator+( Array &other )
{
    for (int i = 0; i < m_size; i++)
    {
        m_array[i] += other.getValue(i);
    }

    return *this;
}
template<class T>
Array<T> &Array<T>::operator+( T val )
{
    for (int i = 0; i < m_size; i++)
    {
        m_array[i] += val;
    }

    return *this;
}
template<class T>
int Array<T>::getSize()
{
    return m_size;
}
4

3 に答える 3

1

2つの問題があります。

  1. を使用const &します。そうしないと、配列がコピーされます。

    インラインフレンドostream&operator <<(ostream&other、const Array&arr)

  2. ポインターを初期化せずにコンストラクターで代入演算子を使用しないでください。

    Array :: Array(Array&other){* this = other; }

これは少なくとも次のようになります。

Array<T>::Array(const Array& other)
    : m_array(0)
{
    *this = other;
}

そして、私はこれがクラッシュする場所だと思います:

template<class T>
Array<T> &Array<T>::operator=( Array& other )
{
    if (m_array != NULL)
        delete[] m_array; // In copy constructor, deletes uninitialized pointer!

    m_size = other.getSize();

    m_array = new T[m_size];

    for (int i = 0; i < other.getSize(); i++)
    {
        m_array[i] = other.getValue(i);
    }

    return *this;
}
于 2012-11-13T18:06:52.167 に答える
1

警告をオンにします。

g++ -std=c++0x -pedantic -Wall -Werror -g    x.cc   -o x
cc1plus: warnings being treated as errors
x.cc: In function ‘std::ostream& operator<<(std::ostream&, Array<T>)’:
x.cc:27: error: no return statement in function returning non-void

そして、間違った機能は次のとおりです。

inline friend ostream &operator<<(ostream &other, Array<T> arr)
于 2012-11-13T18:05:14.740 に答える
1

1)const-correctnessについて本当に学ぶべきです

2) このコードは疑わしいようです

template<class T>
Array<T> &Array<T>::operator+( Array &other )
{
    for (int i = 0; i < m_size; i++)
    {
        m_array[i] += other.getValue(i);
    }

    return *this;
}

other配列の要素が少ない場合はどうなりますか? 未定義の動作が発生します (セグメンテーション違反を含む可能性があります)。

3) を使用した理由は何 m_array[i] += other.getValue(i);ですか? m_arrayプライベートだから?アクセスはオブジェクト レベルではなくクラス レベルで定義されるためm_array[i] = other.m_arry[i]、同様に機能することに注意してください。

4)よい C++ の本を読むことをお勧めします

5) segfault の正確な理由は、配列クラスを使用するコードを投稿した場合にのみ特定できます。

于 2012-11-13T18:02:40.000 に答える