2013-04-03 2 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 
} 

Чтобы это исправить, необходимо либо экземпляр CTTSEngObj или m_pVoiceData должен быть статичным.

+0

Я редактировал свое объяснение сверху. Что вы подразумеваете под STATIC? Можете ли вы показать мне пример, чтобы сделать 2 участника статическими? – tmighty

+0

О вашем объяснении: Ладно, понял. CTTSEngObj не является экземпляром класса. Но могу ли я получить доступ к Instantiated_CTTSEngObj.SomeMember из Instantiated_CTTSEngObj.SomeClass.SomeOtherClass ??? – tmighty

+0

Теперь я создал новый класс (global.cpp) и объявил здесь переменные. Тем не менее, я все еще не могу получить memcpy (nEncodedBytes, m_pVoiceData [iFirstByteToRead], iLenCompressedBytes); работать. Наверное, это другой вопрос. – tmighty

0

Static означает, что объект будет 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 
    } 

Так что, если вы хотите быть разными для каждого объекта, который вы create, вам нужно установить его как нестатический и получить доступ к нему через существующий экземпляр класса.

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; 
} 

Статические переменные используются, если нам нужно совместно использовать некоторые общие данные среди объектов, а переменные-члены - для объектов.

Смежные вопросы