请采取以下措施:
A a; class B; // No content for brevity class A { public: A() { b.SetTitle("hi"); } private: B b; } int main() { return 0; }
这里的问题是,在A中声明的b是在堆上还是在堆栈上声明的.
问题:
这就是我最初的做法,但我认为我有点愚蠢,因为我不得不一直宣称一切都是新的…如果上面是堆栈,我想这不是那么愚蠢吧?
A a; class B; // No content for brevity class A { public: A() { this->b( new B() ); // I don't have C++ 14 :( so i can't do make_unique b->SetTitle("hi"); } private: unique_ptr<B> b; } int main() { return 0; }
解决方法
在固定的内存块中,它仍然可以是或者甚至(如Thomas Matthews在下面指出的那样).在这种情况下,您可以将其视为“A内部”.如果你把A放在堆上它就在堆上.如果在函数顶部分配“A”,比如说,它位于堆栈上(但在A中).
写得像这样它是A的一部分,它的生命周期与A有关.你只需要担心管理A.