как создать несколько производных объектов в куче с разными параметрами через функцию - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть производный класс из базы:

class base{ 
public:
base(){};
~base(){}
};

class derived : public base{
public:
derived(int & input): a(input){};
~derived(){};

int a;
};

У меня есть указатель, который инициирует производный класс в куче следующим образом

main()
{
int b=10;
base * b1;
b1=new derived(b);
factory(b1,5);
    }

Я хочу передать этот указатель b1в фабрику функций для воссоздания нескольких экземпляров b1 после изменения значения b, например:

    void factory(base *p_base,int input_integer)
{
    for(int m=0; m<=input_integer,m++){
    b=m;
    base *b1_duplicate (new p_base);
};

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

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

Этот код просто ужасен.

Некоторые предложения:

1) Недопустимо следующее:

class base{ 
base(){};
~base(){}
};

class derived : public base{
};

Чтобы получить из базы, конструктор иДеструктор должен быть открытым или защищенным.

2) Неверно следующее:

*base b1(new (derived(b));

Указатели объявлены как:

TYPE* name;

3) Это не будетработа

base b1(new (derived(b));

, так как вам нужен конструктор, который принимает указатель на объект derived в качестве параметра.

4) Ваш фабричный метод причиняет мне боль.

0 голосов
/ 12 декабря 2011

Ваш синтаксис C ++ полностью отключен ... Не имеет абсолютно никакого смысла в программировании на C ++ или C.Это выглядит так, как будто вы пытаетесь вывести некоторые понятия из наследования типов javascript или чего-то такого же безобразного.

Это домашнее задание?Заводская функция, как вы ее определяете, не имеет смысла.Даже если вы создаете несколько экземпляров b, что вы делаете с этими экземплярами на фабрике?

Ваши объявления переменных совершенно неверны.Вы должны прочитать на учебнике по C ++, прежде чем пытаться программировать.

Хорошо, теперь перейдем по правильному пути:

Чтобы объявить класс, который будет иметь производные классы, создатель и деструктор должны иметь открытую или защищенную область видимости.Принимая во внимание, что по умолчанию (если вы не указываете область действия) он является закрытым для класса.

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

Итак:

class Base { 
      public Base() { }
      public virtual ~Base() { }
};

class Derived : public Base {

      int a;

      public Derived(int _a) : a(_a) { Base(); }
      public virtual ~Derived() { }
};

Вы путаете синтаксис разыменования указателя с объявлением указателя на тип.Итак, объявление указателя на тип TYPE выглядит следующим образом:

   TYPE * ptype;

, где ptype - это переменная типа TYPE * (указатель на TYPE)

например,

   int *pnum;

pnum содержит адрес ячейки памяти, который указывает на целочисленный тип.

Вы можете использовать pnum для указания на целое число:

   int x = 5;
   pnum = &x;  // read this line as 'pnum refers to x' or 'pnum points to x' or
               // pnum is the memory address of x.

Если вы хотите получить доступ к целочисленному значению, на которое указывает pnum, вы можете «разыменовать» указатель памяти, который вы используете *pnum

   cout << "Address of x in memory (stored in pnum) is: " << pnum << endl
        << "Value of x (pointed to by pnum is: " << *pnum << endl;

Итак, чтобы объявить указатель на базовый класс:

   Base *b;

Чтобы создать экземпляр производного класса, используя указатель базового класса:

   b = new Derived(10);

ВДля того, чтобы создать несколько таких экземпляров и сохранить их в массиве:

   int count = 10;
   Base **b = new Base[count];

   for (i = 0; i < count; i++) {
          b[i] = new Derived(i);
   }

Если что-то из этого сбивает с толку ... и я имею в виду, что вы пытаетесь понять это более 30 секунд.Затем это означает, что вам нужно начать изучать C ++ с нуля.

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