C ++ получить ключ массива в конструкторе массива пользовательского класса / структуры? - PullRequest
1 голос
/ 11 июля 2010

Если у меня есть простой класс, подобный этому:

class MyClass
{
    MyClass(){}
    ~MyClass(){}
public:   
    int myArrayKeyValue;
};

А позже я создаю массив этих классов:

MyClass testing[10];

Как в конструкторе получить доступ к ключу массива, чтобы я мог установить myArrayKeyValue соответствующим образом для каждого элемента массива? Так что я получаю это:

testing[0].myArrayKeyValue = 0;
testing[1].myArrayKeyValue = 1;
testing[2].myArrayKeyValue = 2;
testing[3].myArrayKeyValue = 3;
etc...

Возможно ли сделать это в конструкторе? Или мне нужно просто перебрать массив и присвоить значения вручную?

Ответы [ 6 ]

3 голосов
/ 11 июля 2010

Возможно ли это сделать в конструкторе?

Нет.

Или мне нужно просто пройти через массив и присвоить значениявручную?

Да.Хотя вам, возможно, удастся изменить дизайн так, чтобы не требовалось знание индекса внутри и вне этих экземпляров.

Возможные альтернативы включают:

  • ассоциативный контейнер типа map<int, MyClass>
  • a set<MyClass> со значением ключа, являющимся критериями заказа
0 голосов
/ 11 июля 2010

Может быть полезно подумать, какого конечного результата вы хотите, и попытаться достичь его другими способами.

Один из способов продолжения может быть следующим:

std::vector<MyClass> v;
for (size_t i=0; i<nCount; i++)
    v.push_back(MyClass(static_cast<int>(i)));
0 голосов
/ 11 июля 2010

Нечто подобное было бы возможно:

class MyClass { 
public: 
  MyClass(int index) { myArrayKeyValue = index; } 
  ~MyClass();
private:
int myArrayKeyValue;
}; 

int main() 
{ 
  MyClass testing[5] = { MyClass(1), MyClass (2), 
                   MyClass (3), MyClass (4), MyClass (5) };

  return 0; 
}
0 голосов
/ 11 июля 2010

Вы также можете использовать статический счетчик следующим образом:

class MyClass {
    static size_t static_counter;

    size_t m_value;
public:
    MyClass() {
        m_value = static_counter++;
    }

    inline static void reset() {
        static_counter = 0;
    }

    inline size_t get_value() const {
        return m_value;
    }
};

size_t MyClass::static_counter = 0;

Но у вас есть обязанность сбросить вручную, иначе произойдет нарушение памяти.Это можно исправить путем инкапсуляции на более высоком уровне (сброс в деструкторе).

Редактировать: у меня была та же идея, что и у Николая Н. Фетисова, и предполагалось: статические члены как таковые не должны использоваться в многопоточных программах.

0 голосов
/ 11 июля 2010

Простой элемент на основе нуля static, который увеличивается в конструкторе, должен делать. Вам нужно будет сбросить его, прежде чем создавать массив. Является ли это хорошей идеей - это совсем другая тема:)

0 голосов
/ 11 июля 2010

Вы не можете сделать это прямо из конструктора; он не имеет доступа к расположению объекта в массиве. Вам нужно написать цикл для инициализации.

В качестве альтернативы - и мне немного противно даже упоминать об этом - используйте глобальный или статический счетчик, который вы увеличиваете из конструктора. Построение заказа гарантированно продолжается от начала массива до конца, так что это будет работать технически. Но это ужасно.

(Кстати, конструктор в вашем примере является приватным, поэтому объявление массива даже не скомпилируется.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...