2011-06-23 113 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); 
} 

但它可能不是你想要的。