2013-04-03 231 views
0

我有一个COM对象。 在主课堂上,我做了两个公众成员。C++访问其他类公共成员

public: 
    HANDLE     m_hVoiceData; 
    void*     m_pVoiceData; 

它们用于映射文件。 我在COM对象的实例化处映射文件。

COM对象的主类有一个私有类。 从这个私有类我想访问这些公共成员:

这是我要访问的映射文件:

memcpy(nEncodedBytes,& CTTSEngObj::m_pVoiceData[iFirstByteToRead], iLenCompressedBytes); 

但是编译器不喜欢这个。 它说“非静态成员引用必须是相对于某个对象”。

任何人都可以请告诉我如何正确地做到这一点? 我知道在主类中公开一个成员,但我需要这样做,因为私有类(如上所述)也具有私有类,并且它们都需要该成员来访问某个映射文件。


这是我映射文件:

STDMETHODIMP CTTSEngObj::SetObjectToken(ISpObjectToken * pToken) 
{ 

HRESULT hr = SpGenericSetObjectToken(pToken, m_cpToken); 

//--- Map the voice data so it will be shared among all instances 
// Note: This is a good example of how to memory map and share 
//  your voice data across instances. 
TCHAR szFileName[MAX_PATH+1]; 
GetModuleFileName(_Module.m_hInst, szFileName, MAX_PATH+1); 
StrCpy(PathFindFileName(szFileName), _T("data.dat")); 

if(SUCCEEDED(hr)) 
{ 
    USES_CONVERSION;//needed to make T2W work 
    hr = MapFile(T2W(szFileName), &m_hVoiceData, &m_pVoiceData); 
} 

然后

STDMETHODIMP CTTSEngObj::Speak(DWORD dwSpeakFlags, 
          REFGUID rguidFormatId, 
          const WAVEFORMATEX * pWaveFormatEx, 
          const SPVTEXTFRAG* pTextFragList, 
          ISpTTSEngineSite* pOutputSite) 
{ 

HRESULT hr = S_OK; 

//--- Check args 
if(SP_IS_BAD_INTERFACE_PTR(pOutputSite) || 
    SP_IS_BAD_READ_PTR(pTextFragList) ) 
{ 
    hr = E_INVALIDARG; 
    return hr; 
} 

m_App.DoSomething(); 

M_APP是一类。 它是COM对象主类的私有成员。

这个类有子类,例如: CTTSEngObj.m_App.SomeSmallClass

而且SomeSmallClass需要访问映射文件。

+0

请再显示一些代码 –

+0

“COM对象的主类有一个私有类”。这到底是什么意思呢?你有一个嵌套类? – jogojapan

+0

那么这不是_real_ C++ ...:P –

回答

2

要访问非静态成员,您需要有一个类的实例。根据您的需要,使成员静态或创建一个实例。

在你的代码m_pVoiceData是一个实例成员,但你尝试直接从类访问CTTSEngObj::m_pVoiceData

这相当于

class A 
{ 
    int a; 
}; 
main() 
{ 
    int b = A.a; //same error 
} 

为了解决这个问题,你要么需要的CTTSEngObjm_pVoiceData实例必须是静态的。

+0

我已经编辑了我的解释。 STATIC是什么意思?你能告诉我一个让2个成员静态的例子吗? – tmighty

+0

关于你的解释:好吧,理解。 CTTSEngObj不是一个类的实例。但我可以从Instantiated_CTTSEngObj.SomeClass.SomeOtherClass访问Instantiated_CTTSEngObj.SomeMember吗? – tmighty

+0

我现在创建了一个新类(global.cpp)并在那里声明了变量。但是,我仍然无法获得memcpy(nEncodedBytes,m_pVoiceData [iFirstByteToRead],iLenCompressedBytes);上班。我想这是不同的问题。 – tmighty

0

静态意味着对象仅会被initilized,将成为同一类的每个实例一样,是这样的:如果你想有一个与众不同的每一个对象,你

class A 
    { 
    public: 
    static int a; 
    }; 

    void main() 
    { 
     A::a = 3; // now a will contain 3 for every instance of the class; 
     cout << A::a; //calling the static member without an instance of the class outputs 3 
     A someA; //create some instances of the class 
     A otherA; 

     cout << someA.a; // outputs 3 

     someA.a = 7; // assing 7 to a 

     cout << otherA.a; // outputs 7 for we modified the value of the static member in another instance 
    } 

所以创建,您需要将其设置为非静态,并通过类的现有实例访问它。

0

静态变量是特定于类的,而成员变量是特定于对象的。如果我们有共享对象和成员变量之间的一些常见的数据是特定的对象

class MyClass 
    { 
    static int s_ObjectCount; 
    unsigned int m_id; 
    public: 
    MyClass(int id):m_id(id) 
    { 
     s_ObjectCount++; 
    } 

    ~MyClass() 
    { 
    s_ObjectCount++; 
    } 
    static int GetObjectCount() 
    { 
    return s_ObjectCount; 
    } 
}; 
int MyClass::s_ObjectCount = 0; 

int main(int argc, char* argv[]) 
{ 
    MyClass a(12345); 
    MyClass b(123456); 
    printf("%d",MyClass::GetObjectCount());// outputs 2 
    return 0; 
} 

所以静态变量使用。