如何从静态函数调用本地函数?

时间:2011-06-23 07:11:40

标签: c++

#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添加到列表中。但是,我在静态函数中遇到错误,它说“无法调用成员函数....没有对象”。

如何解决此问题?提前谢谢..

5 个答案:

答案 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 ),其中dcDataCenter个对象。

干杯&amp;第h。,

答案 3 :(得分:0)

static是一种指示编译器“以下函数不操纵实例变量,只对该类的所有实例都是全局的事物”的方法。当你因为某些原因需要保持构造函数私有时使用它,或者有一个执行实例管理的功能(注册等)

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

答案 4 :(得分:0)

正如其他人所说,使addSoundInfo()公开就足以让它可以从其他类中获得。我只想添加一些关于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);
}

但它可能不是你想要的。