Как определить элемент структуры stati c в самой структуре при использовании пространств имен - PullRequest
0 голосов
/ 05 марта 2020

При объявлении и определении структуры с помощью элемента stati c того же типа я не могу понять, как определить значение.

У меня есть структура, содержащая две строки. Я хочу, чтобы была определенная / постоянная версия, к которой я могу получить доступ из самого типа. Для этого я объявляю stati c членов в заголовке и пытаюсь определить их в классе.

Заголовок:

//.h
#pragma once
#include "BaseStruct.h"
#include<string>

namespace A {
    namespace B{
        struct MyStruct : A::C::BaseStruct
        {
            MyStruct(std::string s1, std::string s2);
            static MyStruct myStaticStruct;
        };
    }
}

Класс:

//.cpp
#include "BaseStruct.h"
#include "MyStruct.h"

namespace A {
    namespace B {
        struct MyStruct : A::C::BaseStruct
        {
            MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2)
            {}
        };        

// I have been trying to define MyStaticStruct here.

    }
}

Как мне определить элемент stati c, объявленный в заголовке? Я не могу получить доступ к члену stati c, используя:

MyStruct::MyStaticStruct

, но я должен использовать:

A::B::MyStruct::MyStaticStruct

Почему я не могу получить доступ к члену stati c даже хотя я в пространстве имен A :: B? И, конечно же, как мне определить значение для этого члена?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы не должны повторно объявлять свой класс в ваших cpp файлах, просто определите ваши методы и члены c stati:

namespace A {
    namespace B {
            MyStruct::MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2)
            {}

            MyStruct MyStruct::myStaticStruct("s1", "s2");
    }
}

Обратите внимание, что вы можете быстро столкнуться с инициализацией stati c Закажите фиаско с таким подходом. Лучший вариант - использовать функцию для извлечения вашего синглтона:

#include<string>

namespace A {
    namespace C{
        struct BaseStruct{
            BaseStruct(std::string s1, std::string s2) {};
        };
    }
    namespace B{
        struct MyStruct : A::C::BaseStruct
        {
            MyStruct(std::string s1, std::string s2);
            static MyStruct& myStaticStruct();
        };
    }
}

namespace A {
    namespace B {
            MyStruct::MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2)
            {}

            MyStruct& MyStruct::myStaticStruct()
            {
                static MyStruct singleton("s1", "s2");
                return singleton;
            }
    }
}

Синглтон лениво инициализируется при первом вызове myStaticStruct()

1 голос
/ 05 марта 2020

Удалите определение класса из файла .cpp и реализуйте там только функции-члены - и инициализируйте ваши static переменные:

.cpp

namespace A {
    namespace B {
        // member functions
        MyStruct::MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2) {}

        // static variables
        MyStruct MyStruct::myStaticStruct("foo", "bar");
    }
}
...