Как поместить статический член класса в пространство имен?
#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
должен быть доступен в глобальном масштабе
Если вы хотите, чтобы он был доступен в глобальной области, не помещайте его в пространство имен.