【问题标题】:How to create an object using a constructor that takes arguments on stack in constructor of another Class如何使用构造函数创建对象,该构造函数在另一个类的构造函数中的堆栈上接受参数
【发布时间】:2014-01-02 10:23:11
【问题描述】:

考虑以下代码:

----啊.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 中声明期间传递参数,那么编译器也会抛出错误。创建这样的对象的方法是什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!工作没有问题。
    【解决方案2】:

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

      Point::Point( int x, int y )
    

    如果调用者希望使用包含在另一个对象中的值,则由他来获取和提供它们——但这与你如何编写构造函数绝对没有关系。所以他会像这样调用上面的构造函数:

      Point apoint( 1, 2 );
    

    // 或: 点 apoint(anObj.GetX() 和 Obj.GetY()); // 或者: 一个点 (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 );
    

    【讨论】:

      【解决方案3】:
      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");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-30
        • 2013-04-29
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多