Как поместить статический член класса в пространство имен?

#include <iostream>
#include <stdlib.h>
#include <sstream>

class api
{
private:
    void psParser ()
    {
        std::stringstream psOutput;
        psOutput << "ps --no-headers -f -p " << getpid() << " > .txt";

        system (psOutput.str().c_str());

        std::stringstream processInfo;
        processInfo << ":"__FILE__ << ":" << __DATE__ << ":" << __TIME__ << ":";
    }

public:
    static std::stringstream message;
};

namespace sstreamss
{
    std :: stringstream api :: message;
};

int main ()
{
    api::message << "zxzx";

    return 0;
}

Выход:

error: definition of ‘api::message’ is not in namespace enclosing ‘api’

Я хочу чтобы static std::stringstream message должен быть доступен в глобальном масштабе, поэтому я хочу это в пространстве имен.

Какой выход?

4 ответа

Решение

Я предполагаю, что вы хотите иметь тот же экземпляр api::message доступны для всех переводчиков, которые имеют доступ к api, В отличие от простого, неклассного static данные, которые имеют внутреннюю связь, static У учеников есть внешняя связь. Это означает, что один и тот же экземпляр виден повсюду. Таким образом, вам не нужно играть в любые игры с пространствами имен. Пространство имен здесь ничего не изменит, но оно должно охватывать целое api класс в любом случае.

Одним из способов достижения этого является использование шаблона проектирования Singleton. Определите общедоступную статическую функцию доступа для доступа к экземпляру.

class api
{
 private:
 static bool instanceFlag;
 static api* inst;
 ....
  ....
 public:
 static api* getInstance();
 inline void display(std::string msg)
 { 
       std::cout<<msg;
 }
};
bool api::instanceFlag = false;
api* api::inst = NULL;

api* api::getInstance()
{
 if(! instanceFlag)
 {
    inst = new api();
    instanceFlag = true;
    return inst;
 }
 else
 {
    return inst;
 }
}
int main()
{
  // Access the static instance. Same instance available everywhere
  api::getInstance()->display("zxzx");
}

Вы объявили класс api в глобальном пространстве имен вы не можете определить члена в другом пространстве имен. Что вам нужно сделать, это определить api::message в файле cpp

api.h

class api
{
private:
    void psParser ()
    {
        std::stringstream psOutput;
        psOutput << "ps --no-headers -f -p " << getpid() << " > .txt";

        system (psOutput.str().c_str());

        std::stringstream processInfo;
        processInfo << ":"__FILE__ << ":" << __DATE__ << ":" << __TIME__ << ":";
    }

public:
    static std::stringstream message;
};

api.cpp

std::stringstream api::message;

main.cpp

#include "api.h"

int main ()
{
    api::message << "zxzx";

    return 0;
}

Но это не лучшая практика std::stringstream static, вы можете сделать его локальной переменной, если можете.

Ваш код не компилируется, потому что вы пытаетесь поместить api::message в другое пространство имен из api сам.

Я хочу чтобы static std::stringstream message должен быть доступен в глобальном масштабе

Если вы хотите, чтобы он был доступен в глобальной области, не помещайте его в пространство имен.

Другие вопросы по тегам