Как использовать класс с конструктором в другом классе? - PullRequest
0 голосов
/ 19 марта 2020

Новое в 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) '(вы забыли' () '?) component._id = 123456; ^ ~~~~~~~~ all. cpp: В функции-члене 'void MyMachine :: printComponentInfo ()': all. cpp: 48: 16: ошибка: недопустимое использование функции-члена 'MyComponent MyMachine :: component (int) '(вы забыли' () '?) int id = component.getId ();

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

У вас есть 2 ошибки:

  • отсутствует конструктор по умолчанию для MyComponent класса:
MyComponent() : _id(0) {}
  • неверное объявление частного элемента данных в MyMachine класс:
class MyMachine {
private:
    MyComponent component;
    // ...
};
0 голосов
/ 19 марта 2020

Я думаю, что ваша проблема в понимании , когда вызывается конструктор.

Когда вы создаете новый объект MyMachine, сначала код инициализирует все MyMachine члены до того, как попадет в тело функции конструктора. Вы можете инициализировать членов самостоятельно в списке инициализатора , прежде чем попасть в тело ctor:

MyMachine::MyMachine(int id) :
    _id(id)
{
}

На самом деле, это более эффективный способ обработки инициализации, поскольку все члены должен быть инициализирован перед телом ctor, поэтому в предыдущем состоянии код будет:

  1. Инициализировать _id, используя его ctor без аргументов.
  2. Поместите значение id в MyComponent.

Когда вы используете список инициализатора, в инициализации есть только один шаг, что больше эффективный (особенно в гораздо более сложных типах!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...