How to create an object using a constructor that takes arguments on stack in constructor of another Class
考虑以下代码:
---- A.h
1 2 3 4 5 6 7 | class A{ private: char* mStr; public: A(const char* str); ~A(); } |
---- A.cpp
1 2 3 4 5 6 7 8 9 | A::A(const char* str) { mStr = new char[MAX_SIZE]; strncpy(mStr,str,MAX_SIZE); } A::~A() { } |
---- B.h
1 2 3 4 5 6 7 | class B{ private: A myA; public: B(); ~B(); } |
---- B.cpp
1 2 3 4 5 6 7 8 | B::B() { myA = A("aaa"); } B::~B() { } |
现在的问题是编译器抛出错误:
错误:没有匹配函数来调用'A :: A()'
我想避免使用指针,如果可能的话,希望myA在堆栈上。 如果我在b.h中的声明期间传递参数,那么编译器也会抛出错误。 创建这样的对象的方法是什么?
一种可能的方法是使用初始化列表:
1 2 3 | B::B(const char* str) : myA("aaa") { } |
在您的示例中,A的构造函数没有考虑到需要为其私有成员分配内存,因此如果您不修复它,它可能会崩溃。但是你的问题应该用上面的语法来解决。
当你定义一个接受某些参数的构造函数时,你并不关心它们是如何被提供的或它们来自何处(好吧,对于像int这样的简单的东西你不这样做)。例如
1 | Point::Point( int x, int y ) |
如果调用者希望使用另一个对象中包含的值,那么由他来获取并提供它们 - 但这绝对不会影响你如何编写构造函数。所以他会调用上面的构造函数:
1 | Point apoint( 1, 2 ); |
// 要么:
点apoint(anObj.GetX()和Obj.GetY());
// 要么:
点apoint(anObj.GetX(),anOtherObj.Y);
与Lines构造函数一起使用的语法是将参数传递给ether,该类的成员或该类的基类 - 在您的情况下可能是成员。为了给你一个推动,这里将是你的Line类的一对构造函数,假设你的point类有一组很好的构造函数 - 如果没有,添加它们!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; }; |
被称为:
1 2 3 4 5 | Point aPoint, bPoint; . . Line aline( aPoint, bPoint ); Line bline( 1, 1, 2, 2 ); |
1 2 3 4 5 6 7 | class B{ private: A myA; public: B(); ~B(); } |
在此类中,当您使用
根据我的建议,您可以将
1 2 3 4 | B::B(const char* str) { myA = new A("aaa"); } |