2013-06-17 2 views
1

У меня возникли проблемы с инициализацией элемента static const struct. Я использую полиномы NTL по модулю р (ZZ_pX.h) библиотека и мне нужно для следующей структуры:Объект Static Const

struct poly_mat { 
    ZZ_pX a,b,c,d; 
    void l_mult(const poly_mat& input); // multiplies by input on the left 
    void r_mult(const poly_mat& input); // multiplies by input on the right 

    static const poly_mat IDENTITY; // THIS IS THE PART I AM HAVING TROUBLE WITH 
} 

Так poly_mat является 2х2 матрицей многочленов. У меня есть операции умножения, и в функциях, которые я пишу, мне часто приходится возвращать единичную матрицу a = 1, b = 0, c = 0, d = 1. Я не могу заставить статическую константу poly_mat IDENTITY работать, поэтому прямо сейчас у меня есть функция return_id(), которая выводит идентификационную матрицу, но мне не нужно будет вычислять новую идентификационную матрицу каждый раз, когда я хочу вернуться Это.

Есть ли способ инициализировать статический const poly_mat IDENTITY в моем файле cpp, чтобы я мог просто ссылаться на одну и ту же копию матрицы идентичности, а не на необходимость генерировать новую. Это осложняется тем, что матричные элементы являются полиномами mod p, а p не выбирается до первой строки моего int main(). Может быть, мне нужно сделать IDENTITY указателем на что-то и инициализировать его, как только я установил p? Может ли IDENTITY быть статическим const? Я имею в виду?

Спасибо.

+0

Вы можете получить больше ответов, если вы добавите тег для соответствующего языка. Вы также можете указать ошибку, которую вы получаете при попытке компиляции. –

ответ

1

Этот подход предложен Мейерсом. Просто используйте функцию, как вы это сделали, но сделайте локальную переменную в функции static и верните ссылку на нее. static гарантирует создание только одного объекта.

Вот пример, показывающий, что theIdentity() возвращает один и тот же объект каждый раз.

#include <iostream> 

struct poly_mat { 
    int x; 
    static const poly_mat & TheIdentity(); 
}; 

const poly_mat & poly_mat::TheIdentity() { 
    static struct poly_mat theIdentity = {1}; 
    return theIdentity; 
} 

int main() 
{ 
    std::cout << "The Identity is " << poly_mat::TheIdentity().x 
    << " and has address " << &poly_mat::TheIdentity() << std::endl; 
    struct poly_mat p0 = {0}; 
    struct poly_mat p1 = {1}; 
    struct poly_mat p2 = {2}; 
    std::cout << "The Identity is " << p0.TheIdentity().x 
    << " and has address " << &p0.TheIdentity() << std::endl; 
    std::cout << "The Identity is " << p1.TheIdentity().x 
    << " and has address " << &p1.TheIdentity() << std::endl; 
    std::cout << "The Identity is " << p2.TheIdentity().x 
    << " and has address " << &p2.TheIdentity() << std::endl; 
    return 0; 
} 
+1

«У вас не должно быть' poly_mat' '' poly_mat' как члена, потому что 'poly_mat' еще не объявлен. ' Не верно: декларация члена 'static' может иметь неполный тип. (Но его определение не может.) – aschepler

+0

@aschepler Я этого не понимал, но теперь, когда я думаю об этом, это имеет смысл. Спасибо за исправление. –

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