#ifndef DATACENTER_H_
#define DATACENTER_H_
#include <map>
#include <list>
#include <string>
#include "LiLo/SoundInfo.h"
#include "MutexCondition.h"
#include "UserInfo.h"
using namespace std;
class DataCenter : MutexCondition{
private:
map<long long, list<SoundInfo *> > m_soundListMap;
void add(long long deviceId, SoundInfo* soundInfo);
public:
DataCenter();
virtual ~DataCenter();
static void addSoundInfo(long long deviceId, SoundInfo *soundInfo);
};
#endif /* DATACENTER_H_ */
DataCenter.cpp文件
#include "DataCenter.h"
DataCenter::DataCenter() {
// TODO Auto-generated constructor stub
}
DataCenter::~DataCenter() {
// TODO Auto-generated destructor stub
}
void DataCenter::addSoundInfo(long long deviceId, SoundInfo *soundInfo){
add(deviceId, soundInfo);
}
void DataCenter::add(long long deviceId, SoundInfo *soundInfo){
list<SoundInfo*>& info_list = m_soundListMap[55];
}
我试图从其他类访问函数调用addSoundInfo,所以我将其设置为静态。由于m_soundListMap不是静态的,所以我认为我需要另一个函数来访问本地数据结构。
在静态函数内部,我调用add函数将SoundInfo添加到列表中。但是,我在静态函数中遇到错误,它说“无法调用成员函数....没有对象”。
如何解决此问题?提前谢谢..
答案 0 :(得分:4)
如果您想从其他课程访问addSoundInfo
,则需要将其设为public
,或将其他课程设为DataCenter
的朋友。 static
与访问控制无关。
静态函数未绑定到它所属的类的实例,因此无法访问该类的成员(它也无法调用成员函数)。如果你真的想从静态函数访问成员,你必须明确地将类的实例作为参数传递给静态函数。
如果您对这些基本概念感到困惑,则应阅读good book。
答案 1 :(得分:0)
我想你的意思是你不想让void add()公开,你仍然希望从某些类访问它。这没什么不对,你可以这样做:
class A
{
private:
void DoPrivateStuf() {}
friend class B; // now B can access A private stuf
};
class B
{
// can have any modifier: public, private, protected depending on your needs
public:
void DoPrivateStufToA( A& a )
{
a.DoPrivateStuf();
}
};
答案 2 :(得分:0)
代码似乎无可救药地混乱,但从技术上讲,您只需要删除单词static
。然后,您可以致电dc.addSoundInfo( id, pSoundInfo )
,其中dc
是DataCenter
个对象。
干杯&amp;第h。,
答案 3 :(得分:0)
static
是一种指示编译器“以下函数不操纵实例变量,只对该类的所有实例都是全局的事物”的方法。当你因为某些原因需要保持构造函数私有时使用它,或者有一个执行实例管理的功能(注册等)
当您打算只有一个给定类的实例时(例如因为它是资源管理器),您通常更喜欢遵循 singleton 模式:静态getInstance()
方法返回该类的唯一实例并在需要时创建它,然后保持其他方法的常规方法和状态实例成员。
答案 4 :(得分:0)
正如其他人所说,使addSoundInfo()公开就足以让它可以从其他类中获得。我只想添加一些关于C ++关键字static的观点。基本上,它有很多含义,具体取决于它的使用位置。当一个人将它用于函数时,有两个含义:
在您的情况下,您的问题的答案在技术上将是这样的:
在头文件中:
class DataCenter
{
static void addSoundInfo(DataCenter& dc, long long deviceId, SoundInfo *soundInfo);
}
在源文件中:
void DataCenter::addSoundInfo(DataCenter& dc, long long deviceId, SoundInfo *soundInfo)
{
dc.add(deviceId, soundInfo);
}
但它可能不是你想要的。