2016-12-15 2 views
-2

Пусть говорят, что я decleared это в MyTools.hКак определить «глобальную» структуру?

#ifndef _MYTOOLS_ 
#define _MYTOOLS_ 

typedef struct { 
    // const 
    double LN20; 
    double LN40; 

    // methods 
    double NoteToFrequency(int noteNumber); 
} Tool; 

extern const Tool tool; 

#endif // !_MYTOOLS_ 

Для каждой единицы компиляции, есть только глобальная/Const/уникальный экземпляр Tool. Именно то, что я хочу.

Но теперь: как я могу его определить? В .h я только объявил это. Как я могу определить его в .cpp? Пробовал что-то вроде:

tool.LN20 = 1.34; 

Но, конечно, это не работает. И определение метода?

+1

related/dupe: http://stackoverflow.com/questions/20716091/global-const-object-shared-between-compilation-units – NathanOliver

+2

'const Инструмент инструмента {1.34, 3.14};'? Рабочий пример: [здесь] (https://ideone.com/xiiJ2e). –

+1

Те члены, которые вы назвали '// const', * not * на самом деле постоянны, кстати. –

ответ

-1

extern не определяет какую-либо переменную, которую он просто объявляет. То, что вы wan't достичь можно сделать, как показано ниже:

Ссылка Global const object shared between compilation units объясняет, как сделать это с экстерном сопзЬ

го файла

#ifndef _MYTOOLS_ 
#define _MYTOOLS_ 

struct Tool { 
    // const 
    double LN20; 
    double LN40; 
    double NoteToFrequency(int noteNumber); 

} ; 

extern const Tool tool ; 

#endif // !_MYTOOLS_ 

t1.cpp

#include "t.h" 
#include <stdio.h> 

void use_tool() 
{ 
    printf("%f\n",tool.LN20); 
    printf("%f\n",tool.LN40); 
    return; 
} 

t2.cpp

#include "t.h" 
#include <stdio.h> 


const Tool tool = {.LN20 = 20.0, .LN40 = 30.2}; 
double Tool::NoteToFrequency(int noteNumber) 
{ 
    return 12.0; 
} 
void use1_tool() 
{ 
    printf("%f\n",tool.LN20); 
    printf("%f\n",tool.LN40); 
    return; 
} 
int main() 
{ 
    void use_tool(); 
    use_tool(); 
    use1_tool(); 
    return 0; 
} 

Надеюсь, это поможет.

+0

Я не хочу этого! Поскольку он является 'const', он становится« статическим »по умолчанию, таким образом, 2 разных объекта структуры для каждой единицы компиляции. – markzzz

+0

Да, удалите ключевое слово extern, и оно должно работать так, как вы этого хотите. –

+0

НЕТ! Я хочу extern (т. Е. Уникальный экземпляр) – markzzz

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