С этим кодом много чего не так:
- Как отмечает KennyTM, амперсанд находится не в том месте.
- Вы передаете B * функции, которая принимает B &, они не одинаковы в C ++
- Дизайн, показанный в вашем фрагменте php, выглядит неправильно.Хотя то, что вы делаете, это то, что вы, возможно, захотите делать время от времени, вы, скорее всего, захотите использовать вместо этого конструктор, C ++ и PHP.
- Вы помещаете код непосредственно в файл, это не разрешено в C ++, вместо этого поместите его в основную функцию
- управление памятью: вы используете
new
без delete
(или класс умного указателя) - Вы используете класс B в классе A, в то время как класс A не знает о классе B (он будет определен позже) - вы должны поставить класс B поверх(или, возможно, используйте предварительное объявление)
Ниже показано несколько способов правильной работы вашего кода.
include <memory>
using std::auto_ptr;
class B
{
}
class A
{
public:
A();
SetB(B& b);
private:
B b1; // a B made in the constructor
B b2; // a COPY of the original B you make
}
A::A()
: b1(/*whatever you want to pass to B's constructor*/)
{
}
A::SetB(B& b)
{
b2 = b;
}
int main(int agrc, char** argv)
{
A firstA();
B firstB();
firstA.SetB(firstB);
A* secondA = new A();
B* secondB = new B();
secondA->SetB(*secondB);
auto_ptr<A> thirdA(new A());
auto_ptr<B> thirdB(new B());
thirdA->SetB(*thirdB);
// whatever other code
delete secondA;
delete secondB;
}
Обратите внимание, что id вы вызываете SetB только один раз (и естьнет проблем с циклическими зависимостями между различными объектами, которые вы создаете), но вам do нужна гибкость построения B вне класса, вместо этого вы можете сделать параметр конструктора.
Также обратите внимание, что вы делаете копию B, которую вы создаете в main - если вы хотите использовать пришедшую копию в классе (как вы это делаете в PHP), вы должны использовать ссылку на член (в этом случае вам нужно будет установитьчто это гВ конструкторе это невозможно, вы не можете сделать это в функции SetB.
Затем обратите внимание, что существуют серьезные проблемы с подходом secondA, secondB, и поэтому он не рекомендуется (выше ничего не будет работать неправильнотем не менее, легко получить код, который пропускает память таким образом (и трудно выяснить, где утечка), и вдобавок к этому, когда вы хотите использовать исключения, вам понадобится безопасный код для исключения, который недостижим при использовании обычногостарые указатели.
Наконец, обратите внимание, что вы смешиваете и сопоставляете здесь.Например, нет никаких проблем с использованием firstA и третьего B вместе.