stattic const в struct
От: xorix  
Дата: 03.03.10 13:57
Оценка:
Добрый день!

Вот есть одна задачка такого вида, решил обратиться к общественному разуму, так как своего на эту задачку не хватает
Может быть кто-то уже сталкивался и нашёл решение.

К примеру есть у нас две структуры:

struct test_struct
{
unsigned int id;
std::wstring name;

static const std::string info;
};

const std::string test_struct::info = "йцуке";


хотелось бы всё это написать в хедере и не создавать для этой задачи отдельный cpp файл.

Впринципе можно так сделать, но если этот хедер заинклудить из двух разных cpp-файлов, то линкер ругается на двойное объявление.
#pragma once и ifdefы соответственно не помогают. Может быть это как-то можно через шаблоны сделать или какой другой способ,
но додуматься пока не получается. Буду оч. признателен вашей помощи.
Re: stattic const в struct
От: uzhas Ниоткуда  
Дата: 03.03.10 14:02
Оценка:
хороший совет: вытащи статическую переменную из структуры, тогда сможешь ее определять даже в хедере
плохой совет: внеси всю структуру в анонимный неймспейс, должно скомпилироваться и, возможно, работать
Re: stattic const в struct
От: remark Россия http://www.1024cores.net/
Дата: 03.03.10 14:06
Оценка:
Здравствуйте, xorix, Вы писали:

X>Впринципе можно так сделать, но если этот хедер заинклудить из двух разных cpp-файлов, то линкер ругается на двойное объявление.

X>#pragma once и ifdefы соответственно не помогают. Может быть это как-то можно через шаблоны сделать или какой другой способ,
X>но додуматься пока не получается. Буду оч. признателен вашей помощи.

Пометь определение переменной как __declspec(selectany). Для gcc там есть __attribute__ аналогичный.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: stattic const в struct
От: Andrew S Россия http://alchemy-lab.com
Дата: 03.03.10 15:01
Оценка: :))
X>Добрый день!

X>Вот есть одна задачка такого вида, решил обратиться к общественному разуму, так как своего на эту задачку не хватает

X>Может быть кто-то уже сталкивался и нашёл решение.

X>К примеру есть у нас две структуры:


X>struct test_struct

X>{
X> unsigned int id;
X> std::wstring name;

X> static const std::string info;

X>};

X>const std::string test_struct::info = "йцуке";



Не увидел двух структур, ну да ладно. Щас я вас научу плохому, вы так старайтесь не делать.


template<int>
struct test_struct_impl
{
    unsigned int id;
    std::wstring name;

    static const std::string info;
};

template <int ID>
const std::string test_struct_impl<ID>::info = "йцуке";

typedef test_struct_impl<0> test_struct;
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: stattic const в struct
От: xorix  
Дата: 03.03.10 23:05
Оценка:
Здравствуйте, Andrew S, Вы писали:

X>>Добрый день!


X>>Вот есть одна задачка такого вида, решил обратиться к общественному разуму, так как своего на эту задачку не хватает

X>>Может быть кто-то уже сталкивался и нашёл решение.

X>>К примеру есть у нас две структуры:


X>>struct test_struct

X>>{
X>> unsigned int id;
X>> std::wstring name;

X>> static const std::string info;

X>>};

X>>const std::string test_struct::info = "йцуке";



AS>Не увидел двух структур, ну да ладно. Щас я вас научу плохому, вы так старайтесь не делать.



AS>
AS>template<int>
AS>struct test_struct_impl
AS>{
AS>    unsigned int id;
AS>    std::wstring name;

AS>    static const std::string info;
AS>};

AS>template <int ID>
AS>const std::string test_struct_impl<ID>::info = "йцуке";

AS>typedef test_struct_impl<0> test_struct;
AS>




Доброй ночи, чё-то не заработало, после создания структуры info == ""
Re[3]: stattic const в struct
От: xorix  
Дата: 03.03.10 23:07
Оценка:
Да и остальные предложенные способы не заработали как хотелось, но всё равно спасибо, буду биться дальше
Re: stattic const в struct
От: _niko_ Россия  
Дата: 04.03.10 00:10
Оценка:
Здравствуйте, xorix, Вы писали:


X>Добрый день!


X>Вот есть одна задачка такого вида, решил обратиться к общественному разуму, так как своего на эту задачку не хватает

X>Может быть кто-то уже сталкивался и нашёл решение.

X>К примеру есть у нас две структуры:


X>struct test_struct

X>{
X> unsigned int id;
X> std::wstring name;

X> static const std::string info;

X>};

X>const std::string test_struct::info = "йцуке";



X>хотелось бы всё это написать в хедере и не создавать для этой задачи отдельный cpp файл.


Если мы объявляем какую нить константу в *.h файле, то проинициализирована она должна быть в *.cpp файле, таковы требования компиляторов (хотя где то, щас не припомню тока, это проглатывалось, толи под Линуксовый какой то компилятор толи ещё как то).

X>Впринципе можно так сделать, но если этот хедер заинклудить из двух разных cpp-файлов, то линкер ругается на двойное объявление.

X>#pragma once и ifdefы соответственно не помогают. Может быть это как-то можно через шаблоны сделать или какой другой способ,
X>но додуматься пока не получается. Буду оч. признателен вашей помощи.

В данном случае, если все правельно сделано, #pragma once и ifdefы нимогут ни помочь ибо для этого они и преднозначены — полюбому что то не так делается.


file_1.h
    #ifndef FILE_1_H
    #define FILE_1_H

    
    class Test1
    {
    public:
        Test1() { }
        ~Test1() { }

        . . . . .
    };
    
    #endif



file_2.h
    #pragma once

    class Test2
    {
    public:
        Test2() { }
        ~Test2() { }

        . . . . .
    };



file_3.cpp
    #include "file_1.h"
    #include "file_2.h"
    
    Test1 t1;
    Test2 t2;



file_4.cpp
    #include "file_1.h"
    #include "file_2.h"
    
    Test1 t1;
    Test2 t2;
Re[2]: stattic const в struct
От: _niko_ Россия  
Дата: 04.03.10 00:21
Оценка:
__>Здравствуйте, xorix, Вы писали:

__> . . . . .


Поспешил нажать Отправить

__>file_1.h

__>
__>    #ifndef FILE_1_H
__>    #define FILE_1_H

    
__>    class Test1
__>    {
__>    public:
__>        Test1() { }
__>        ~Test1() { }

        static const unsigned const_value;

__>        . . . . .
__>    };
    
__>    #endif
__>



file_1.cpp
    #include "file_1.h"
    
    const unsigned Test1::const_value = 10;



__>file_2.h

__>
__>    #pragma once

__>    class Test2
__>    {
__>    public:
__>        Test2() { }
__>        ~Test2() { }

        static const unsigned const_value;

__>        . . . . .
__>    };
__>



file_2.cpp
    #include "file_2.h"
    
    const unsigned Test2::const_value = 20;



__>file_3.cpp

__>
__>    #include "file_1.h"
__>    #include "file_2.h"
    
__>    Test1 t1;
__>    Test2 t2;
__>



__>file_4.cpp

__>
__>    #include "file_1.h"
__>    #include "file_2.h"
    
__>    Test1 t1;
__>    Test2 t2;
__>


От файлов 'file_1.cpp' и 'file_2.cpp' никуда не деться, если тока Вы не пишите извращенный код, чего делать крайне не желательно.
Re: stattic const в struct
От: Bell Россия  
Дата: 04.03.10 02:40
Оценка: +3
Здравствуйте, xorix, Вы писали:


struct test_struct
{
unsigned int id;
std::wstring name;

static const std::string& info_fn();
};

inline const std::string&test_struct::info_fn()
{
   static const std::string info = "йцуке";
   return info;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: stattic const в struct
От: anglichanin  
Дата: 04.03.10 02:50
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Не увидел двух структур, ну да ладно. Щас я вас научу плохому, вы так старайтесь не делать.



AS>
AS>template<int>
AS>struct test_struct_impl
AS>{
AS>    unsigned int id;
AS>    std::wstring name;

AS>    static const std::string info;
AS>};

AS>template <int ID>
AS>const std::string test_struct_impl<ID>::info = "йцуке";

AS>typedef test_struct_impl<0> test_struct;
AS>


руки отрывать за такое надо
Re: stattic const в struct
От: Caracrist https://1pwd.org/
Дата: 04.03.10 05:51
Оценка:
Здравствуйте, xorix, Вы писали:


X>Добрый день!


X>Вот есть одна задачка такого вида, решил обратиться к общественному разуму, так как своего на эту задачку не хватает


// header
struct test_struct
{
unsigned int id;
std::wstring name;

static const std::string info;
};

#ifdef(INCLUDED_IN_MAIN_CPP) 
const std::string test_struct::info = "йцуке";
// other global vars...
#endif //INCLUDED_IN_MAIN_CPP

// cpp_main
#define INCLUDED_IN_MAIN_CPP
#include "header.h"
//...

// cpp_other
#include "header.h"
//...
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: stattic const в struct
От: Caracrist https://1pwd.org/
Дата: 04.03.10 06:40
Оценка:
Здравствуйте, xorix, Вы писали:

X>Доброй ночи, чё-то не заработало, после создания структуры info == ""

http://codepad.org/qHVRenE1
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: stattic const в struct
От: xorix  
Дата: 04.03.10 10:38
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, xorix, Вы писали:


X>>Доброй ночи, чё-то не заработало, после создания структуры info == ""

C>http://codepad.org/qHVRenE1



Спасибо большое, с шаблоном всё заработало! В целом немного громоздко получается, но зато работает!
Оставлю на выбор пользователю моей библиотеки пусть сам решает как лучше, cpp отдельный создавать или шаблоном пользоваться
Re[3]: stattic const в struct
От: Andrew S Россия http://alchemy-lab.com
Дата: 04.03.10 18:58
Оценка: +1
AS>>
AS>>template<int>
AS>>struct test_struct_impl
AS>>{
AS>>    unsigned int id;
AS>>    std::wstring name;

AS>>    static const std::string info;
AS>>};

AS>>template <int ID>
AS>>const std::string test_struct_impl<ID>::info = "йцуке";

AS>>typedef test_struct_impl<0> test_struct;
AS>>


A>руки отрывать за такое надо


Да ладно уж. Вполне неплохой способ не делать глупых прагм, и работает везде...
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.