如何在另一个类中使用带有构造函数的类?

Posted

技术标签:

【中文标题】如何在另一个类中使用带有构造函数的类?【英文标题】:How to use a class with a constructor in another class? 【发布时间】:2020-03-19 10:39:20 【问题描述】:

C++ 中的新功能,我想在另一个类中使用一个带有构造函数的类,并在全局范围内使用它的方法。

MyMachine 类调用 MyComponent 类。如果 MyComponent 没有构造函数,它可以工作,但我不知道如何使用构造函数调用它。

工作:

#include <iostream>

/*********************************************
* MyComponent
*********************************************/

// MyComponent.h
class MyComponent

  public:
    int _id;
    MyComponent();
    int getId();
;

// MyComponent.cpp
MyComponent::MyComponent()




int MyComponent::getId()

  return _id;


/*********************************************
* MyMachine
*********************************************/

// MyMachine.h
class MyMachine

  private:
    MyComponent component;
  public:
    MyMachine();
    void printComponentInfo();
;

MyMachine::MyMachine()

  component._id = 123456;


void MyMachine::printComponentInfo()

  int id = component.getId();
  std::cout << id << "\n";


/*********************************************
* Main
*********************************************/

int main()

  MyMachine machine;
  machine.printComponentInfo();

return 0;

显示 123456

但是使用构造函数,它不起作用:

#include <iostream>

/*********************************************
* MyComponent
*********************************************/

// MyComponent.h
class MyComponent

  public:
    int _id;
    MyComponent(int id);
    int getId();
;

// MyComponent.cpp
MyComponent::MyComponent(int id)

    _id = id;


int MyComponent::getId()

  return _id;


/*********************************************
* MyMachine
*********************************************/

// MyMachine.h
class MyMachine

  private:
    MyComponent component(int id);
  public:
    MyMachine();
    void printComponentInfo();
;

MyMachine::MyMachine()

  component._id = 123456;


void MyMachine::printComponentInfo()

  int id = component.getId();
  std::cout << id << "\n";


/*********************************************
* Main
*********************************************/

int main()

  MyMachine machine;
  machine.printComponentInfo();

return 0;

抛出错误

all.cpp:在构造函数“MyMachine::MyMachine()”中:all.cpp:43:7: 错误: 无效使用成员函数‘MyComponent MyMachine::component(int)’ (你忘了'()'吗?) 组件._id = 123456; ^~~~~~~~~ all.cpp:在成员函数'void MyMachine::printComponentInfo()'中:all.cpp:48:16:错误:无效使用 成员函数‘MyComponent MyMachine::component(int)’(你 忘记“()”?) int id = component.getId();

【问题讨论】:

使用member initializer list调用参数构造函数 【参考方案1】:

你有两个错误:

缺少MyComponent 类的默认构造函数:
MyComponent() : _id(0) 
MyMachine 类中的私有数据成员声明错误:
class MyMachine 
private:
    MyComponent component;
    // ...
;

【讨论】:

谢谢它有效。我只是想知道如何在 MyMachine 中使用选定的 int 参数调用 MyComponent() 构造函数。这可能吗? @Phoax 当然有可能。你可以拥有像MyMachine::MyMachine() : component(1) 这样的MyMachine 构造函数。这里调用了MyComponent 构造函数。如果回答对你有帮助,请采纳。 @Phoax 或者你甚至可以做MyMachine::MyMachine(int id) : component(id) ...【参考方案2】:

我认为您的问题在于理解何时调用构造函数。

当您构造MyMachine 的新对象时,代码首先初始化MyMachine 的所有成员进入构造函数的主体。在进入 ctor 主体之前,您可以在 initializer list 中自行初始化成员:

MyMachine::MyMachine(int id) :
    _id(id)


其实这是一种更高效的初始化方式,因为所有成员必须在ctor体之前初始化,因此,在之前的状态下,代码会:

    使用其无参数 ctor 初始化 _id。 将值id 放入MyComponent。

当您使用初始化器列表时,初始化过程中只有 一个 步骤,效率更高(尤其是在更复杂的类型中!)。

【讨论】:

以上是关于如何在另一个类中使用带有构造函数的类?的主要内容,如果未能解决你的问题,请参考以下文章

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

如何防止类中的类对象尝试在没有默认构造函数的情况下自动构建自身?

如何在另一个类中的 JPanel 类中实现 ActionListener?

使用从构造函数传递到方法的类中的参数访问rest

有没有办法覆盖 LINQtoSQL 生成的类中的空构造函数?

在 C++ 中使用参数在构造函数中定义自己的类的数组