0

COM オブジェクトがあります。メイン クラスでは、2 つのパブリック メンバーを作成しました。

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 はマップされたファイルにアクセスする必要があります。

4

3 に答える 3

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
    }

したがって、作成するオブジェクトごとに を異なるものにしたい場合は、それを非静的として設定し、クラスの既存のインスタンスを介してアクセスする必要があります。

于 2013-04-03T13:02:10.977 に答える
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;
}

したがって、オブジェクト間で共通データを共有する必要がある場合は静的変数が使用され、メンバー変数はオブジェクトに固有です。

于 2015-01-17T12:07:55.757 に答える