我在头文件中有这个定义:
class Owner
{
private:
// Fields
Child* _myChild1;
public:
// Constructors
Owner();
Owner(const char childName[]);
};
和这个实现:
Owner::Owner(const char childName[])
{
//do some operations - children must be created after these ops
_myChild = new Child(childName);
}
和这个main()函数:
int main()
{
Owner("child1");
}
有些问题,请在这里请耐心等待,我刚开始使用C ++ ..
_myChild(childName);
Child _myChild(childName);
感谢您的任何建议..
答案 0 :(得分:5)
像这样:
class Owner
{
private: // Fields
Child _myChild1;
public: // Constructors
Owner();
Owner(const char childName[]);
};
Owner::Owner()
:_myChild1("Default Name")
{}
Owner::Owner(const char childName[])
:_myChild1(childName)
{}
// Without more info about what you are doing it is hard to tell
// But a trivial change could be
Owner::Owner()
// Child defautl constructor called here
{
// Do processing.
_myChild1.updateName(name);
}
Owner::Owner(const char childName[])
// Child defautl constructor called here
{
// Do processing.
_myChild1.updateName(std::string("X") + childName);
}
问题是在孩子面前你需要做什么样的处理。
作为一方不是:
答案 1 :(得分:4)
你在这里描述的是“组合”,其中一个类位于另一个类中。在此,Owner
包含Child
的指针。因此,Child
实例的实际分配和初始化必须在运行时的某个地方完成。
如果希望Owner
包含一个Child
的实例,而不必在new
的堆上分配,只需将成员变量声明为:
Child _myChild1;
而不是指针。
答案 2 :(得分:3)
基本上,它是如何工作的:
new
在堆上分配。如果确实包含了一个完整的类,它将在构造所有者对象的同时构造。除非另有明确说明,否则编译器将使用默认构造函数。
选项1:
// will create a Child object using the default constructor.
// this is done even before doStuff() is called.
Owner::Owner(const char childName[]) {
doStuff();
}
选项2:
// will create a Child object using the Child(const char*) constructor.
// again, done before doStuff() is called.
Owner::Owner(const char childName[]): _myChild(childName) {
doStuff()
}
你不能在构造函数本身内使用_myChild(childName);
语法,因为 _myChild 在它到达那么远之前就已经被构造了。 Child _myChild(childName);
是合法的,但它会创建一个名为 _myChild 的新本地对象,而不是修改类成员 _myChild 。这可能不是预期的结果。
如果要在构建后为 _myChild 指定新值,请执行以下操作之一:
_myChild = childName;
,或使用某种形式的_myChild.setName(childName);
函数)。< / LI>
_myChild = Child(childName);
创建新的子级并将其分配给成员变量。这第二个选项尽管是功能性的,但是效率很低,因为它需要构造对象两次,没有充分的理由。