Заполните статический членский контейнер в C++

Вы можете использовать EntityManager:

entityManager.createNativeQuery("select seqname.nextval ...").getSingleResult();
11
задан Maleev 23 April 2009 в 08:35
поделиться

5 ответов

общее решение состоит в том, чтобы сделать что-то вроде этого:

// header
class Foo
{
...
private:
   static list<string> s_List;
}

// cpp
list<string> init()
{
     list<string> tmp;
     ... fill tmp with strings

     return tmp;
 }

 list<string> Foo::s_List(init());

другой метод похож на предложенный Нилом Баттервортом.

15
ответ дан 3 December 2019 в 03:19
поделиться

Другой альтернативой является создание простого класса инициализатора:

list <string> Foo::s_List;

struct Init {
   Init() {
      Foo::s_List.insert("apple");
      Foo::s_List.insert("bannana");
      Foo::s_List.insert("grapes");
   }
};

static Init doInit;

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

Однако я просто перечитал ваш вопрос, и возникла другая мысль - если список постоянный, вы, вероятно, не будете его изменять, в котором В случае простого массива строк, инициализированного строками в отсортированном порядке, может быть лучшим решением. Конечно, поиск будет быстрее (с использованием std :: binary_search), чем в списке, и, конечно, его легко инициализировать.

8
ответ дан 3 December 2019 в 03:19
поделиться

Это зависит от того, какие значения нужно поместить в этот список. Являются ли они статическими или требуют какой-то формы вычислений?

Если они статические, вы можете сделать это:

namespace {
   const char* const initVals[] = { "A", "B", "C" };
}

list<string> Foo::s_list(initVals, initVals + 3);
1
ответ дан 3 December 2019 в 03:19
поделиться

The ways I(the author of the question) have vainly tried to do this.


I tried to do smth like (in Foo.cpp):

list<string> Foo::s_List = list<string>();
Foo::s_List.insert("apple");
Foo::s_List.insert("bannana");
Foo::s_List.insert("grapes");

But that gives a compiler error.


Then I thought of making an Initialize() method and calling it right from the code

void Foo::Initialize()
{
    s_List.insert("rats");
    s_List.insert("cats");
}

Foo::Initialize(); 

// error: compiler considers it to be a redefenition of the method, not a call.


The only viable idea left (havent yet tried) would be to check if the list is empty in each method that uses it, and if it's the case, call Initialize(). But that's ugly!

0
ответ дан 3 December 2019 в 03:19
поделиться

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

0
ответ дан 3 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

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