如何使用构造函数创建对象,该构造函数在另一个类的构造函数中获取堆栈上的参数

时间:2014-01-02 10:23:11

标签: c++

请考虑以下代码:

---- A.h

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() 
{
}

---- B.h

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

---- B.cpp

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

B::~B() 
{
}

现在的问题是编译器抛出错误: 错误:没有匹配函数来调用'A :: A()'

我想避免使用指针,如果可能的话,希望myA在堆栈上。如果我在b.h中的声明期间传递参数,那么编译器也会抛出错误。创建这样的对象的方法是什么?

3 个答案:

答案 0 :(得分:1)

当你定义一个接受某些参数的构造函数时,你并不关心它们是如何被提供的或它们来自哪里(好吧,对于像int这样的简单的东西你不这样做)。例如

  Point::Point( int x, int y )

如果调用者希望使用另一个对象中包含的值,那么由他来获取并提供它们 - 但这绝对不会影响你如何编写构造函数。所以他会调用上面的构造函数:

  Point apoint( 1, 2 );

//或:       点apoint(anObj.GetX()和Obj.GetY()); // 要么:       点apoint(anObj.GetX(),anOtherObj.Y); 与Lines构造函数一起使用的语法是将参数传递给ether,该类的成员或该类的基类 - 在您的情况下可能是成员。为了给你一个推动,这里将是你的Line类的一对构造函数,假设你的point类有一组很好的构造函数 - 如果没有,添加它们!

  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 );

答案 1 :(得分:1)

一种可能的方法是使用初始化列表:

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

在您的示例中,A的构造函数没有考虑到需要为其私有成员分配内存,因此如果您不修复它,它可能会崩溃。但是你的问题应该用上面的语法来解决。

答案 2 :(得分:0)

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

在此类中,当您使用A myA时,这意味着构造函数将创建一个类A的对象。但是在A myA中意味着它将调用未定义的构造函数A()

根据我的建议,您可以将myA声明为A* myA,而在构造函数B中,您可以使用new myA("aaa"),如下所示。

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