Предупреждение GDB: символ RTTI не найден для класса - PullRequest
5 голосов
/ 09 апреля 2011

Я использую 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--;
    }
};

[/ код]

...