инициализация структуры с входным параметром - PullRequest
2 голосов
/ 17 февраля 2011

Я новичок в C ++, и у меня проблема с инициализацией моего контейнера occ_stat_t с использованием функции-члена CNetwork::CNetwork.

Я думаю, что что-то не так в строке: occ_stat[0]( num_elements_ ) , occ_stat[1]( num_elements_ ) но я не знаю, как правильно написать это.

Я хотел бы узнать, как инициализировать мою структуру, которая в каждом occ_stat, occupied_counter будет содержать n элементов и mean_life_time будет присвоено значение 0.

Буду признателен за любую помощь.

привет

#include <iostream>
#include <boost/multi_array.hpp>
#include <cstdint>

typedef boost::multi_array< uint32_t , 1> uint32_1d_t;

struct occ_stat_t {
    occ_stat_t (uint32_t n ):
            occupied_counter( boost::extents[n] ) {}

    uint32_1d_t occupied_counter;
    double      mean_life_time;
};

class CNetwork {
public:
    CNetwork ( uint32_t num_elements_ );

private:
    occ_stat_t  occ_stat[2];

};

CNetwork::CNetwork ( uint32_t num_elements_ ) 
: occ_stat[0]( num_elements_ ) , occ_stat[1]( num_elements_ )
{
    // do something
}

int main( ) {

    uint8_t foo = 5;
    CNetwork Network(foo);

    return 0;

}

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Я не знаю, возможно ли получить доступ к индексам массива в списках инициализаторов.Если только на C ++ 0x - который вы есть - но не в VS 2010, поскольку он там не реализован.

Итак, вы должны:

CNetwork::CNetwork ( uint32_t num_elements_ ) 
{
    occ_stat[0].occupied_counter =  boost::extents[num_elements_];
    occ_stat[1].occupied_counter =  boost::extents[num_elements_];

    //or 

    occ_stat[0] = occ_stat_t(num_elements_);
    occ_stat[1] = occ_stat_t(num_elements_);

    // do something
}

РЕДАКТИРОВАТЬ:

Хорошо, поэтому вы также должны добавить конструктор по умолчанию, так как мы инициализируем его в списке инициализатораИтак:

struct occ_stat_t {

    occ_stat_t () : occupied_countr(/*default_to_whatever_boost_extents is*/){};

    /* Don't need this one we default construct now
    occ_stat_t (uint32_t n ):
            occupied_counter( boost::extents[n] ) {}
    */

    uint32_1d_t occupied_counter;
    double      mean_life_time;
};
0 голосов
/ 17 февраля 2011

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

Однако зачем вам этот массив данных [2], член occ_stat? Не лучше ли иметь 2 члена с более конкретными именами?

class CNetwork {
public:
    CNetwork ( uint32_t num_elements_ );

private:
    occ_stat_t  occ_stat_for_somthing;
    occ_stat_t  occ_stat_for_another;

};

CNetwork::CNetwork ( uint32_t num_elements_ ) 
:
  occ_stat_for_something( num_elements_ ) , 
  occ_stat_for_another( num_elements_ )
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...