Рассмотрим следующий код:
---- Ах
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, то и компилятор выдает ошибку. Как создать такой объект?
Один из возможных способов - использовать список инициализаторов:
B::B(const char* str) : myA("aaa")
{
}
В вашем примере конструктор A не учитывает, что память должна быть выделена для него частным членом, поэтому может произойти сбой, если вы не исправите это. Но ваша проблема должна быть решена с помощью синтаксиса выше.
Когда вы определяете конструктор с определенными аргументами, вам все равно, как они поставляются или откуда они пришли (ну, для чего-то простого, такого как 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 );
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");
}