0

std::stringコンストラクターから取得したサイズのポインターの配列を初期化したい。また、2 つの配列に対して同じことを行いたいのですintが、以下のコードはコンパイルされません。

class MyQuickInitArray
{
public:
    MyQuickInitArray(int size)
    {
        if(size <= 0)
        {
            throw new std::exception;
        }

        _size = size;
        _counter = 0;
        A = new std::string[size];
        B = new int[size];
        C = new int[size];
    }

    std::string& operator[](int j) {
        if(j > _size)
        {
            throw std::out_of_range("out of range");
        }

        if(((B[j]<0) || (B[j]>=_counter)) || (C[B[j]]!=j))
        {
            // A[j] points to junk
            _counter++;
            A[j] = new std::string;
            B[j] = _counter-1;
            C[_counter-1] = j;
            return A[j];
        }

        // the cell was instantiated before
        return A[j];
    }

    ~MyQuickInitArray(){};


private:
    std::string* A[];
    int B[];
    int C[];
    int _size;
    int _counter;
};

ctor から取得したサイズの配列を正しく宣言するにはどうすればよいですか?

編集:

発生するエラーは次のとおりです。

incompatible types in assignment of ‘std::string* {aka std::basic_string<char>*}’ to ‘std::string* [0] 

int配列の場合:

incompatible types in assignment of ‘int*’ to ‘int [0]’
4

2 に答える 2

3

これらは C++ で静的配列を宣言する有効な方法ではありません。コンパイル時に配列サイズを知る必要があります。以下のコードは、特別な拡張機能なしでは標準 C++ でコンパイルできません。

std::string* A[];
int B[];
int C[];

ポインターで遊んでいるだけなら問題ありません。ただし、使用を考えた方がよいでしょうstd::vector

#include <vector>
std::vector<std::string> A;
std::vector<int> B;
std::vector<int> C;

私はあなたのコードを以下に書き直すかもしれません:

class MyQuickInitArray
{
public:
    MyQuickInitArray(int size)
      : A(size),
        B(size),
        C(size),
        size_(size),
        counter_(0)
    {     
    }

    std::string operator[](int j) const 
    {
        return A.at(j);
    }

private:
    std::vector<std::string> A;
    std::vector<int> B;
    std::vector<int> C;
    int size_;
    int counter_;
};
于 2013-01-23T08:37:29.800 に答える
0

代わりに配列メンバーを使用したいと思いますstd::vector<std::string>std::vector<int>コード全体がより単純になります。

しかし、本当に配列を使用したい場合は、試してみることができます(私がお勧めしたわけではありません):

class MyQuickInitArray
{
public:
    MyQuickInitArray(int size):_size(0),_counter(0),A(nullptr),B(nullptr),C(nullptr)
    {
        if(size <= 0)
        {
            throw new std::exception;
        }

        _size = size;

        typedef std::string* pSTR;
        A = new pSTR[size];
        B = new int[size];
        C = new int[size];
    }

    std::string& operator[](int j) {
        if(j > _size)
        {
            throw std::out_of_range("out of range");
        }

        if(((B[j]<0) || (B[j]>=_counter)) || (C[B[j]]!=j))
        {
            // A[j] points to junk
            _counter++;
            A[j] = new std::string;
            B[j] = _counter-1;
            C[_counter-1] = j;
            return *A[j];
        }

        // the cell was instantiated before
        return *A[j];
    }

            ~MyQuickInitArray(){
               for(int j=0; j<_size; ++j)
                   if(((B[j]<0) || (B[j]>=_counter)) || (C[B[j]]!=j))
                      delete A[j];                       
               delete[]A; delete[]B; delete[]C;};
            }


private:
    std::string** A;
    int *B;
    int *C;
    int _size;
    int _counter;
};
于 2013-01-23T08:51:36.990 に答える