Преобразование типов к собственным С++

82
15 января 2021, 00:50

Не могу разобраться как преобразовать типы данных. В моем случае из строки в тип TElement.

Допустим есть Класс TSpisok, в нем функция AddElement принимающая TElement *e в качестве параметра

class TElement
{
public:
   TElement *next,*prev;
};
class TSpisok
{
TElement *first,*last,*cur;
public:
   TSpisok() {
    first = last = cur = NULL;
  };
  class TNumber : TElement {
    public: int num;
    TNumber(int n): TElement(),
    num(n) {}
  };
  class TString : TElement {
    public: char str[20];
    TString(char s[20]): TElement() {
        strcpy(str, s);
    }
  };
   void AddElement (TElement *e)
   {
   //что то делается
   };
   void ShowList (int index)
   {
       cur = first;
       while (cur != NULL) {
       Form1->ListBox1->Items->Add(cur);
   }
   };
}

По нажатию кнопки нужно передать в функцию AddElement значение из текстобокса, т.е. строку типа String\Char

TElement * p;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char * st;
int k;
st = new char[20];
st = Edit1->Text.c_str();
if (strstr(st, "") != NULL) {
            k = atoi(st);
            if (k || (strlen(st) == 1 && st[0] == '0'))
                        p = new TNumber(k);
            else p = new TString(st);
            Spisok.AddElement(p);
        }
    }

и как вывести элемент списка на ListBox в форме?

   void ShowList (int index)
      {
           cur = first;
           while (cur != NULL) {
           Form1->ListBox1->Items->Add(cur);
           }
      };

На что получаю ошибку. Вопрос, как грамотно передавать параметры?

[C++ Error] Unit1.cpp(65): E2034 Cannot convert 'TElement *' to 'AnsiString'

Answer 1

class TNumber : TElement {...} означает закрытое наследование, которое подразумевает, что наследуемый класс лишь может использовать открытые и защищенные члены базового. Только функции_члены этого класса и друзья класса могут преобразовать указатель класса в указатель базового. Поэтому, если вы хотите во внешней функции делать это, то следует наследовать открыто: class TNumber : public TElement {...} или же struct TNumber : TElement {...}. По хорошему все ваши сущности структуры...

READ ALSO
Из чисел и знаков сделать правильные неравенства

Из чисел и знаков сделать правильные неравенства

Даны n целых чисел и ряд из n коробокМежду коробками фиксировано расположены знаки неравенств

96
Для чего нужен второй параметр у оператора operator delete?

Для чего нужен второй параметр у оператора operator delete?

Есть ли разница в объявлении operator delete(void*) и operator delete(void*, size_t) для класса? Нужен ли на самом деле второй параметр? И если да, то зачем?

97
В iOS не кликабельны input в попап окне fancybox

В iOS не кликабельны input в попап окне fancybox

Обнаружилось, что на iOS устройствах в попап окне Fancybox 3 не кликабельны input поля, те

120
Заменить ссылки на странице

Заменить ссылки на странице

Есть много ссылокНужно дописать им якорь на другую страницу

119