我有一个COM对象。 在主要班级,我做了两个公共成员。
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 :(得分:2)
要访问非静态成员,您需要拥有该类的实例。根据您的需要,使成员静态或创建实例。
在您的代码中m_pVoiceData
是实例成员,但您尝试直接从类CTTSEngObj::m_pVoiceData
这相当于
class A
{
int a;
};
main()
{
int b = A.a; //same error
}
要解决此问题,您需要CTTSEngObj
或m_pVoiceData
的实例必须是静态的。
答案 1 :(得分:0)
静态意味着该对象只会被初始化一次,并且对于同一个类的每个实例都是相同的,如下所示:
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
}
因此,如果您希望对于您创建的每个对象都不同,则需要将其设置为非静态,并通过该类的现有实例访问它。
答案 2 :(得分: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;
}
因此,如果我们必须在对象之间共享一些公共数据,并且成员变量特定于对象,则使用静态变量。