Динамически распределяемый объект класса - PullRequest
0 голосов
/ 08 марта 2012

У меня есть простой класс, который вы видите ниже:

Вопросы

  1. Могу ли я иметь в своем конструкторе класса Playground такой, как этот Playground(int aRow, int aColumn); Если ДА как я должен выделить память в этом случае для элементов строки и столбца?Если НЕТ почему?
  2. Почему я не могу написать mPlayground[0][0] = 0 и что я могу сделать для этого?Если можно, конечно.

Playboard.h

#pragma once
#ifndef PLAYBOARD_H
#define PLAYBOARD_H

class Playground
{
public:
    Playground()
    {       
    }
};

class Playboard
{
public:
    Playboard();
    ~Playboard();

private:
    Playground** mPlayground;
    int mRows;
    int mColumns;

public:
    void Initialize(int aRow, int aColumn);
};

#endif /** PLAYBOARD_H */

Playboard.cpp

#include "Playboard.h"
Playboard::Playboard()
{
    mPlayground = 0;
}

void Playboard::Initialize(int aRow, int aColumn)
{
    // Set rows and columns in order to use them  in future.
    mRows = aRow;
    mColumns = aColumn;

    // Memory allocated for elements of rows.
    mPlayground = new Playground*[aRow];
    // Memory allocated for elements of each column.
    for (int i=0; i<aRow; i++)
        mPlayground[i] = new Playground[aColumn];
}

Playboard::~Playboard()
{
    // Free the allocated memory
    for (int i=0; i<mRows; i++)
        delete[] mPlayground[i];
    delete[] mPlayground;
}

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

1a Могу ли я иметь в своем конструкторе класса Playground такой же Playground (int aRow, int aColumn);

Да, тривиально:

class Playground {
    int x, y;
    Playgrown(int aX, int xY) : x(aX), y(aY) {}
};

1b Если ДА, как я должен выделить память в этом случае для элементов строки и столбца? Если НЕТ, почему?

Вам не нужно выделять память вообще. Playground не содержит указателей и, следовательно, не требует выделения.

2 Почему я не могу написать mPlayground[0][0] = 0 и что я могу сделать для этого? Если я могу, конечно.

Поскольку вы не перегрузили оператор присваивания для Playground. Например,

class Playground {
    …
    // Sample operator=. You'll need to implement its semantics
    void operator=(int) {}
};

<ч /> Вы не можете инициализировать элементы массива с new. Вы могли бы сделать это:

{
    mPlayground[i] = new Playground[aColumn];
    for(int x = 0; x < i; x++)
      mPlayground[i][x] = Playground(3,4);
}
1 голос
/ 08 марта 2012

1) Да:

Playground(int aRow, int aColumn)
{
}

2) РЕДАКТИРОВАТЬ: Извините, я думал, что это был более сложный вопрос.Я оставлю ниже ответ здесь для дальнейшего использования.Чтобы иметь возможность писать mPlayground[0][0] = 0, вам потребуется перегрузить

Playground& Playground::operator = ( int x );

Старый ответ:

Чтобы иметь доступ к Playground объектам из класса Playboard, выможет перегрузить оператор () и вызвать:

Playground Playboard::operator()(int r, int c)
{
    return mPlayground[r][c];
}

//...
Playboard p;
p(x,y);

или оператор []:

Playground* Playboard::operator[] (int r)
{
    return mPlayground[r];
}

 //...
 Playboard p;
 p[x][y];
...