在C++中用另一个类初始化类?

jam*_*ieQ 4 c++ class-design

我在头文件中有这个定义:

class Owner
{
private:
    // Fields
    Child* _myChild1;
public:
    // Constructors
    Owner();
    Owner(const char childName[]);
};
Run Code Online (Sandbox Code Playgroud)

这个实现:

Owner::Owner(const char childName[])
{
//do some operations - children must be created after these ops
_myChild = new Child(childName);
}
Run Code Online (Sandbox Code Playgroud)

这个main()函数:

int main()
{
Owner("child1"); 
}
Run Code Online (Sandbox Code Playgroud)

有些问题,请在这里请耐心等待,我刚开始使用C++ ..

  • 鉴于子类在编译时是已知的,我认为我不需要在堆上使用'new'创建它们吗?如果是这样的话?我已尝试在Owner实现中使用此语法,但编译器发出呻吟声('术语不计算函数..'):

_myChild(childName);

  • 但是,在实现中使用这种语法是可以的,为什么呢?

Child _myChild(childName);

  • 我使用的范例是否正确?换句话说,作为一般规则,如果一个类包装另一个类,那么所有者是否只持有指向它包装的类的指针?
  • 你会有更多有经验的人这样做吗?

谢谢你的任何建议..

Mar*_*ork 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);
}
Run Code Online (Sandbox Code Playgroud)

问题是你需要在孩子面前做什么样的处理.

作为一方不是:

  • 避免使用下划线作为成员名称中的第一个字符.
    大部分时间都可以,但有些情况不是.所以最好避免它们.
  • 而不是传递一个字符数组传递std :: string const&