Я использую Eclipse с GDB.Для любого класса умного указателя, такого как MyString, я получаю предупреждение
: символ RTTI не найден для класса MyString
И действительно, я не вижузначение, хранящееся в контейнере интеллектуального указателя:
MyString str = "test"; //can see "test" fine when examining variable value
MyStringPtr strPtr = &str; //can not see "test" contained by the container strPtr when examining variable value.
Я полагаю, что предупреждение является причиной того, что указатель «test» стал указателем void, а не типизированным указателем MyString.Тем не менее, это работает:
int L = strPtr->length(); //correctly is 4
char c = strPtr->charAt(1); //correctly is 'e'.
Так что GDB, кажется, обрабатывает вещи правильно, но не идеально, так что я не могу отлаживать.
Я должен упомянуть, что при разработке вVisual Studio.Проблема возникает только для Eclipse с Cygwin g ++.
Параметры компиляции Cygwin g ++: -O0 -g3 -Wall -c -fmessage-length = 0
Ниже приведен упрощенный эскиз соответствующих классов.
[код]
class MyObjectPtr
{
protected:
MyObject* pObj;
public:
MyObjectPtr(MyObject* p= 0);
MyObjectPtr(const MyObjectPtr& r);
~MyObjectPtr();
protected:
void set(MyObject* p)
{
if(p!=0) p->incrementReference();
if(pObj!=0) pObj->decreasetReference();
pObj= p;
}
void set(const char* chArray)
{
pObj= new MyString(chArray);
if(pObj!=0) pObj->incrementReference();
}
void assertError(const char* error);
public:
const MyObjectPtr& operator=(const MyObjectPtr& r)
{
set(r); return *this;
}
const MyObjectPtr& operator=(MyObject* p)
{
set(p); return *this;
}
MyObject* operator->()
{
if(pObj==null) assertError("MyObject");
return pObj;
}
operator MyObject*() const { return pObj; };
MyObjectPtr(const char* pch)
{
set(pch);
};
const MyObjectPtr& operator=(const char* pch);
};
class MyStringPtr : public MyObjectPtr
{
public:
MyStringPtr(MyObject* p= 0) : MyObjectPtr(p) {}
MyStringPtr(const int n) : MyObjectPtr() {}
const MyStringPtr& operator=(MyObject* p)
{
set(p); return *this;
}
MyString* operator->()
{
if(pObj==null) assertError("MyString");
return (MyString*)pObj;
};
MyStringPtr(const char* pch)
{
if( pch != NULL )
{
set( new MyString(pch) );
}
else
set( NULL );
}
//other MyString related
};
class MyString : public MyObject
{
int length;
char* data;
void allocate(int iSize)
{
data= new char[iSize];
}
DString(const char* dataIn)
{
if(dataIn==0) assertError("NullString");
length= strlen(dataIn);
alloc(length+1);
memcpy(data, dataIn, length+1);
}
};
class DFC_DLL DObject
{
int referenceCount;
void incrementReference()
{
referenceCount++;
}
void decrementReference()
{
referenceCount--;
}
};
[/ код]