2013-02-12 5 views
0

Я новичок в C++ и попытаюсь написать имидж кэша. Конструктор класса CACHE являетсяОбъявить объект класса с параметрами без использования if ... else

CACHE (int, int, int, int, CACHE *); //declare 

и в main(), я пытаюсь создать объекты в соответствии с некоторой переменной:

int main() 
{ 
     if (L2_size == 0)  //only one level of cache 
     { 
     CACHE L1(L1_size, blocksize, L1_assoc, inclusion, 0); 
     } 
     else      //2 level of caches 
     { 
     CACHE L2(L2_size, blocksize, L2_assoc, inclusion, 0); 
     CACHE L1(L1_size, blocksize, L1_assoc, inclusion, &L2); 
     } 
} 

Проблема с этим состоит в том, что я не в состоянии получить доступ к L1 и L2, поскольку их объем внутри, если ... else.

Кроме того, я пробовал использовать? : оператор для реализации этого, все еще получить ошибку:

нет соответствия для тернарного оператора.

Есть ли способ сделать это? Благодаря!

+3

Включите пример использования 'L2' и' L1'. В качестве примера, если 'L2_size == 0', нет' L2', так что должно произойти с кодом, который пытается использовать 'L2'? Или это как раз о 'L1'? – Yakk

+0

Вы посмотрели этот пост? http://stackoverflow.com/questions/1917718/are-multiple-conditional-operators-in-this-situation-a-good-idea –

+0

если L2_size == 0, для L2-кеша нет объекта – ARGOS

ответ

1

Что-то вроде этого, возможно:

CACHE *L2 = 0; 
    CACHE *L1 = 0; 


    if (L2_size) 
    { 
     L2 = new CACHE(L2_size, blocksize, L2_assoc, inclusion, 0); 
    } 
    L1 = new CACHE(L1_size, blocksize, L1_assoc, inclusion, L2); 

Я уверен, что есть и другие возможности.

+0

Спасибо Mats. Кажется, что L1 всегда указывает на L2 в соответствии с вашим кодом. – ARGOS

+0

+1, и @ARGOS это не так. '* L2' равно 0 (null), если' L2_size' ненулевого характера создает новый CACHE и присваивает его '* L2'. Если 'L2_size' равно нулю,' * L2' будет NULL при создании L1, именно то, что вы хотели. – WhozCraig

+0

@WhozCraig, вы правы, спасибо! – ARGOS

0

Вы можете использовать контейнер, такой как std::list или std::vector, перед оператором if и просто push_back столько объектов CACHE, сколько вам нужно.

Пример:

int main() 
    { 
     std::list<CACHE> caches; 
     if (L2_size == 0) 
     { 
      caches.push_front(CACHE(L1_size, blocksize, L1_assoc, inclusion, 0)); 
     } 
     else 
     { 
      caches.push_front(CACHE(L2_size, blocksize, L2_assoc, inclusion, 0); 
      caches.push_front(CACHE(L1_size, blocksize, L1_assoc, inclusion, &(*caches.begin()); 
     } 
    } 

Какой бы метод вы используете, идея заключается в том, чтобы создать переменную стека (list, pointer, или что угодно) до вашего if заявления, так что он остается в области.

+0

@ Маты Отредактировано. Новая версия хорошая? Он выполняет эту работу, хотя подходит только для двухуровневого кеш-сценария, но это то, чего хочет OP. – JBentley

+0

@Mats Petersson, адрес L2 передается в L1, есть указатель CACHE в L1, который указывает на L2 – ARGOS

+0

@ARGOS. Маты ссылались на мою предварительно отредактированную версию, которая пренебрегла пропусканием адреса L2 к L1. – JBentley

Смежные вопросы