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

0

Рассмотрим следующий код:

---- Ах

class A{
    private:
        char* mStr;
    public:
        A(const char* str);
        ~A();      
}

---- A.cpp

A::A(const char* str) 
{
    mStr = new char[MAX_SIZE];
    strncpy(mStr,str,MAX_SIZE);
}

A::~A() 
{
}

---- Bh

class B{
    private:
        A myA;
    public:
        B();
        ~B();      
}

---- B.cpp

B::B() 
{
    myA = A("aaa");
}

B::~B() 
{
}

Теперь проблема заключается в том, что компилятор бросает ошибку: error: нет соответствующей функции для вызова "A :: A()"

Я хочу избежать использования указателя и, если возможно, хочу myA на стеке. Если я передаю аргумент во время объявления в bh, то и компилятор выдает ошибку. Как создать такой объект?

Теги:

3 ответа

1
Лучший ответ

Один из возможных способов - использовать список инициализаторов:

B::B(const char* str) : myA("aaa")
{
}

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

  • 0
    Спасибо! Работает без проблем.
1

Когда вы определяете конструктор с определенными аргументами, вам все равно, как они поставляются или откуда они пришли (ну, для чего-то простого, такого как int у вас нет). Для примера

  Point::Point( int x, int y )

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

  Point apoint( 1, 2 );

//или: Point apoint (anObj.GetX() и Obj.GetY()); // или: Point apoint (anObj.GetX(), anOtherObj.Y); Синтаксис, который вы использовали с конструктором Lines, заключается в передаче аргументов в эфир члену этого класса или базовому классу этого класса - в вашем случае, вероятно, член. Чтобы дать вам толчок, здесь будет хорошая пара конструкторов для вашего класса Line, предполагая, что ваш класс точек имеет хороший набор собственных конструкторов - и если нет, добавьте их!

  class Line
  {
  public:
      Line( const Point& p1, const Point&p1 )
      : m_Point1(p1), m_Point2(p2)
      {}

      Line( int x1, int y1, int x2, int y2) 
      : m_Point1(x1, yx), m_Point2(x2, y2)
      {}
  private:
      Point m_Point1;
      Point m_Point2;
  };

Вызывается как:

  Point aPoint, bPoint;
  .
  .
  Line aline( aPoint, bPoint );
  Line bline( 1, 1, 2, 2 );
0
class B{
    private:
        A myA;
    public:
        B();
        ~B();      
}

В этом классе, когда вы используете A myA это означает, что конструктор создаст один объект класса A Но в A myA означает, что он вызовет конструктор A() который не определен.

Согласно моему предложению, вы можете объявить myA как A* myA и внутри конструктора B, вы можете использовать new myA("aaa") как new myA("aaa") ниже.

B::B(const char* str) 
{
    myA = new A("aaa");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню