c ++: поведение члена данных указателя в иерархии наследования классов - PullRequest
0 голосов
/ 17 июня 2011
class Base {

    protected:
            string m_strName;
            char* pchChar;
    public:
            Base()
            {
                    m_strName = "Base";
                    pchChar   = NULL;
            };

           void display()
            {
                    printf(" display name : %s %c\n",m_strName.c_str(),pchChar);
             };
  };

 class Derived : protected Base {
       public:
               Derived()
               {
                       init();
               };

            void init()
            {
                    m_strName = "Derived";
                    pchChar = (char*)malloc(sizeof(char));
                    strcpy(pchChar,"A");
                    printf(" char %c\n",*pchChar);
                    display();
            };
};

int main()
{
        Derived* pDerived = new Derived();
        return 0;
}

Наблюдаемый результат равен

    char A
    display name : Derived P

, тогда как я ожидал, что pchChar должен иметь значение "A" в обоих случаях.я пропускаю какую-то часть информации?Просьба предложить.

Ответы [ 2 ]

2 голосов
/ 17 июня 2011
printf(" display name : %s %c\n",m_strName.c_str(),pchChar);

должно быть:

printf(" display name : %s %c\n",m_strName.c_str(),*pchChar);

Первый из них приведёт указатель в символ и, следовательно, будет полностью зависеть от , где этот символ находится в вашем адресном пространстве.

Второй будет правильно разыменовывать указатель для получения символа, точно так же, как вы это сделали в init коде вашего производного класса.

И этот маленький фрагмент:

pchChar = (char*)malloc(sizeof(char));

не не выделяет достаточно места для строки "A", для этого вам нужно два символа:

pchChar = (char*)malloc(2); // sizeof(char) is ALWAYS 1 !!!

Или еще лучше, не используйте malloc вообще. Хотя C ++ предоставляет эти возможности для совместимости с C, вам, вероятно, лучше использовать new и delete.

2 голосов
/ 17 июня 2011

Вы забыли *:

printf(" display name : %s %c\n",m_strName.c_str(), *pchChar);

Это должно быть *pchChar, а не pchChar. Потому что вы печатаете его как %c.

Или вы можете использовать %s в качестве строки формата, и ваш printf сработает, если c-строка будет строкой с нулевым символом в конце. В настоящее время не имеет нулевого завершения. Вы должны сделать это:

pchChar = (char*)malloc( 2 * sizeof(char)); //2 chars, one for `\0`
strcpy(pchChar,"A");

Или еще лучше использовать new и std::cout.

Кроме того, не забудьте позвонить free с malloc, чтобы освободить память, как только вы закончите с ней. А если вы используете new, используйте delete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...