Является ли следующий код законным в C++. Доступ к общедоступному методу участника класса друзей? Я знаю, что это звучит запутанно, и лучший способ показать это в коде. Мне было интересно, верен ли TestClassC :: Method() в коде ниже?C++ Доступ к общедоступному методу друзей class-> member->?
Я скомпилировал (g ++), но он работает, однако я столкнулся с ситуацией, когда он вызывает ошибку сегментации на других машинах/дистрибутивах в TestClassC :: Method(). Что заставляет меня задаться вопросом, если this-> classA_Ptr-> classB.Method(); является законным в C++.
#include <iostream>
using namespace std;
class TestClassB
{
public:
TestClassB(void){};
~TestClassB(void){};
void Method(void){
cout << "Hello Again" << endl;
}
};
class TestClassC; //Forward Declaration
class TestClassA
{
friend class TestClassC;
public:
TestClassA(void){};
~TestClassA(void){};
private:
TestClassB classB;
};
class TestClassC
{
public:
TestClassC(TestClassA* a_Ptr){
this->classA_Ptr = a_Ptr;
}
~TestClassC(void){};
void Method(void){
//Is this Valid/Legal ???
this->classA_Ptr->classB.Method();
}
private:
TestClassA* classA_Ptr;
};
int main()
{
cout << "Hello world!" << endl;
TestClassA testClassA;
TestClassC classC(&testClassA);
classC.Method();
return 0;
}
Кажется прекрасным для меня - я не понимаю, почему это может быть segfault. Хорошо работает и на моей платформе (MacOSX 10.5, Intel CPU). –
Он работает для меня в Xcode, и я уверен, что gcc. Просто говорю'. – 2010-08-20 03:10:49
Проверьте состояние члена 'classA_Ptr', когда вы получаете seg-fault. То, что у вас есть, - это действительно действующий код. Возможно, что указатель 'class A' недействителен извне и является висячей ссылкой при попытке получить к нему доступ. – dirkgently