2011-06-23 71 views
1
#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

C++没有本地函数(尽管有解决方法,您的代码似乎没有任何可以描述为本地函数的东西)。 –

+0

@Ben:但是C++ 0x幸运的! :) – Xeo

+0

@Xeo:不,它不。但是解决方法稍微好一些。 @Space:如果你的意思是一个函数内的类内的函数,这就是我的解决方法。而且这里没有完成。 –

回答

4

如果你想从其他类访问addSoundInfo,你需要使它public,或使其他类朋友DataCenterstatic与访问控制无关。

静态函数没有绑定到它所属类的实例,因此无法访问该类的成员(它也不能调用成员函数)。如果你真的想从一个静态函数访问成员,你必须显式地将这个类的一个实例作为参数传递给静态函数。

如果您对这些基本概念感到困惑,您应该阅读good book

0

我想你的意思是你不想让void add()成为public并且仍然想从某些类访问它。这是没有错的,你可以这样来做:


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(); 
    } 
}; 

 
0

代码似乎无可救药的混乱,但在技术上你只需要删除单词static。然后您可以拨打​​其中dc是一个DataCenter对象。

干杯&心连心,

0

static是指示编译“下面的函数不是操作实例变量,只有那些全球这一类的所有实例的东西”的方式。当你需要保持你的构造函数是私有的,或者有一个实例管理(注册等)的函数时,你可以使用它。

当你打算只有一个给定类的实例时(例如,因为它一个资源管理器),你通常更愿意遵循singleton模式:一个静态的getInstance()方法,该方法返回该类的唯一实例并根据需要创建它,然后让其他方法保持常规方法和状态实例成员。

0

正如其他人所说,制作addSoundInfo()public就足以让它可以从其他类中使用。我只会添加一些关于C++关键字static的观点。基本上,它有很多含义取决于它在哪里使用。当用于功能时,有两个含义:

  • 静态类函数:一个函数绑定到一个类,而不是任何特定的对象。从这个意义上说,它与名称空间概念类似 - 使用scope :: operator来访问函数。
  • 静态函数:该函数具有内部链接,这意味着它只在当前翻译单元(当前源文件)中可见。它对于实用功能很方便。

在你的情况,回答您的问题将在技术上是这样的:

在头文件:

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); 
} 

但它可能不是你想要的。