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: 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[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 — стараемся писАть по-русски
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 &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
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[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 отдельный создавать или шаблоном пользоваться
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.