0

ポインターの設定方法の何が問題なのか理解できません。私は次のことに沿って何かをしようとしています:

matrix[0] = new Array<T>(columnSize);

しかし、それはコンパイルされません。問題は、matrix[0] が参照を返し、それに new Array(columnSize) を割り当てることは合法ではないことだと思いますか?

ここにエラーがあります

/Users/Ezequiel/desktop/wow/Matrix.h: In constructor ‘Matrix<T>::Matrix(size_t, size_t) [with T = int]’:
main.cpp:8:   instantiated from here
/Users/Ezequiel/desktop/wow/Matrix.h:18: error: invalid conversion from ‘Array<int>*’ to ‘long unsigned int’
/Users/Ezequiel/desktop/wow/Matrix.h:18: error:   initializing argument 1 of ‘Array<T>::Array(size_t) [with T = Array<int>*]’

以下にすべてのコードを添付しました。

// Array.h

#ifndef ARRAY_H
#define ARRAY_H

#include <string>
#include <iostream>
#include <algorithm>

template<class T>
    class Array {
        private:
            T* elements;
            size_t low, high;
            void init(const size_t, const size_t);
            void copy(const Array<T>&);

        public:
            size_t size;
            Array();
            ~Array();
            Array(const size_t);
            Array(const size_t, const size_t);
            Array(const Array<T>&);

            T& operator[](const size_t);
            Array<T>& operator=(const Array<T>&);

            template<class X>
                friend std::ostream& operator<<(std::ostream&, const Array<X>&);
    };

template<class T>
    void Array<T>::init(const size_t low, const size_t high) {
        if (high < low || (high - low + 1 <= 0)) {
            std::cout << "An error was found in the bounds passed to the constructor.\n";
            exit(1);
        }

        size = high - low + 1;
        elements = new T[size];

        this->low = low;
        this->high = high;
    }

template<class T>
    void Array<T>::copy(const Array<T>& someArray) {        
        delete[] elements;

        if (someArray.size) {
            elements = new T[someArray.size];
            std::copy(someArray.elements, someArray.elements + someArray.size, elements);
            low = someArray.low;
            high = someArray.high;
            size = someArray.size;
        } else {
            size = 0;
            elements = 0;
            low = high = -1;    
        }
    }

template<class T>
    Array<T>::Array() {
        size = 0;
        elements = 0;
        low = high = -1;
    }

template<class T>
    Array<T>::Array(const size_t size) {
        init(0, size - 1);
    }

template<class T>
    Array<T>::Array(const size_t low, const size_t high) {
        init(low, high);
    }

template<class T>
    Array<T>::~Array() {
        delete[] elements;
    }

template<class T>
    Array<T>::Array(const Array<T>& someArray) {
        copy(someArray);
    }

template<class T>
    Array<T>& Array<T>::operator=(const Array& someArray) {
        if (this == &someArray) {
            return *this;
        }

        copy(someArray);

        return *this;   
    }

template<class T>
    T& Array<T>::operator[](const size_t index) {
        if (index < low || index > high || size <= 0) {
            std::cout << "The index " << index << " goes out of bounds.\n";
            exit(1);
        }
        return elements[index - low];
    }

template<class X>
    std::ostream& operator<<(std::ostream& os, const Array<X>& someArray) {
        if (someArray.elements) {
            for (size_t i = 0; i < someArray.size - 1; ++i) {
                os << someArray.elements[i] << ", ";
            }
            os << someArray.elements[someArray.size - 1];
        } else {
            os << 0;
        }
    }

#endif

// Matrix.h
#include "Array.h"

template<class T>
    class Matrix {
        private:
            Array< Array<T>* > *matrix;
            size_t rowSize, columnSize;
        public:
            Matrix(const size_t rowSize, const size_t columnSize);
    };

template<class T>
    Matrix<T>::Matrix(const size_t rowSize, const size_t columnSize) {
        matrix = new Array< Array<T>* >(rowSize);

        // Compiles perfectly fine, except after I uncomment this line:
        // matrix[0] = new Array<T>(columnSize);

        this->rowSize = rowSize;
        this->columnSize = columnSize;
    }
4

1 に答える 1

0

matrixではありませんArray<Array<T>*>。それはArray<Array<T>*>*-- へのポインタArray<Array<T>*>です。これは、matrix[0](より適切に と書く*matrix; 以下を参照) のタイプが であることを意味しArray<Array<T>*>ます。

ではなくmatrix経由で割り当てています。1 つのオブジェクトのみが割り当てられています。を使用してこの単一のオブジェクトを参照できますが、 で割り当てているため、逆参照演算子を使用することをお勧めします。を使用すると、あなたやコードの読者は、. ありません。newnew[]matrix[0]newmatrix[0]matrix[1]

そのコメントアウトされたステートメントを修正する方法は、使用することです

(*matrix)[0] = new Array<T>(columnSize);

ループで割り当てている場合は、

(*matrix)[idx] = new Array<T>(columnSize);

行列のi,j要素の参照は を介し​​て行われることに注意してください(*matrix)[i][j]

使用することを主張する場合は、使用matrix[0]する必要があります

matrix[0][idx] = new Array<T>(columnSize);

行列のi,j要素を割り当てmatrix[0][i][j]て参照します。

于 2012-06-10T05:00:03.047 に答える