Массив как частный член класса

У вас может быть такой запрос sql,

public Cursor usingDistinct(String column_name) {
        return db.rawQuery("select DISTINCT "+column_name+" from "+TBL_NAME, null);
    }
14
задан Bill the Lizard 18 September 2012 в 14:12
поделиться

1 ответ

Если вы хотите, чтобы вы нужны «реальный» массив C-стилей, вам необходимо добавить указатель частного элемента в свой класс, и выделить динамически память для него в конструкторе (с ). Очевидно, вы не должны забывать освободить его в деструкторе.

class YourClass
{
  private:
    int * array;
    size_t size;

    // Private copy constructor operator to block copying of the object, see later
    // C++03:
    YourClass(const YourClass &); // no definition
    // C++11:
    YourClass(const YourClass&) = delete;

  public:
    YourClass(size_t Size) : array(new int[Size]), size(Size)
    {
        // do extra init stuff here
    };

    ~YourClass()
    {
        delete [] array;
    }
};

Чтобы сделать эту работу проще, вы можете рассмотреть возможность использовать умный указатель (например, A Boost :: Scoped_Array в C ++ 03, или в простых STD :: Unique_ptr В C ++ 11), что вы можете инициализировать с помощью списка инициализатора перед конструктором или просто в конструкторе.

class YourClass
{
  private:
    boost::scoped_array<int> array; // or in C++11 std::unique_ptr<int[]> array;
    size_t size;
  public:
    YourClass(size_t Size) : array(new int[Size]), size(Size)
    {
        // do extra init stuff here
    }

    // No need for a destructor, the scoped_array does the magic
};

Оба эти решения создают несопируемые объекты (вы не указывали, если они должны быть скопировать и их копию семантики); Если класс не должен быть скопирован (который происходит в большинстве случаев), эти оба в порядке, и компилятор будет генерировать ошибку, если вы попытаетесь скопировать / назначать один класс на другой, в первом случае, потому что копия по умолчанию Конструктор был перегружен с частным (или простой удаленным в C ++ 11), во втором случае, потому что Boost :: Scoped_Array и STD :: Unique_ptr невыразится.

Если вместо этого вы хотите иметь копироваемые объекты, то вы должны решить, хотите ли вы создать копию, которая разделяет массив (так, просто копия указателя) или если вы хотите создать новый, отдельный массив для другой объект.

В первом случае вы должны быть очень осторожны, прежде чем освободить выделенную память, поскольку другие объекты могут использовать его; Счетчик является наиболее распространенным решением. Вам можно помочь в этом со стороны BOOST :: Shared_Array (или STD :: Shared_PTR в C ++ 11), который выполняет все отслеживание для вас.

Если вместо этого вы хотите сделать «глубокую копию», вам придется выделить новую память и скопировать все объекты исходного массива в целевой массив. Это не полностью тривиально, чтобы сделать правильно, и обычно выполняется через «Копировать» и своп идиома «.

Тем не менее, самое простое решение состоит в том, чтобы использовать STD :: Vector в качестве частного элемента в качестве частного элемента: он будет обрабатывать все материалы распределения / отделки самостоятельно, правильно построить / уничтожать себя, когда объект вашего класса построен / разрушен. Более того, он реализует глубокую копию семантики из коробки. Если вам нужно сделать ваши абоненты доступ к вектору только для чтения, то, вы можете написать Getter, который возвращает Const_Iterator или const Ссылка на вектор объект.

11
ответ дан 1 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: