Почему я не могу использовать объект класса в качестве параметра - PullRequest
0 голосов
/ 25 ноября 2018

У меня проблема с получением класса для передачи в качестве параметра для другого конструктора класса.В основном код выглядит следующим образом:

class A
{
    public:
       int ID;
       A(int getID)
       {
           ID = getID;
       }
}

, и я хочу использовать этот класс A в качестве члена класса B следующим образом:

class B
{
    public:
        A someA;
        A someB;
        int number;

    B(A ObjectA, A ObjectB, int getNumber)
    {
        someA = ObjectA;
        someB = ObjectB;
        number = getNumber;
    }
};

Ошибки в основном говорят о том, что естьнет подходящей функции для вызова B::B().Я не знаю, что с этим не так.Я делал подобные вещи с векторами объекта, поэтому подумал, почему эта штука не работает.Любые входные данные / исправления приветствуются, спасибо!

Sidenotes: я попытался добавить конструктор по умолчанию для B, как это было предложено в другом потоке, но в итоге получилось недопустимое использование B::B.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Используйте список инициализации для ваших объектов:

B(A ObjectA, A ObjectB, int getNumber)
:someA(std::move(ObjectA)), someB(std::move(ObjectB)), number(getNumber)
{
}

Это будет использовать конструктор перемещения по умолчанию из вашего класса.

Я использовал move здесь, потому что вы передаете свои объекты позначение, поэтому имеет смысл переместить их.Если вы передали их через const &, то не перемещайте их и не используйте конструктор копирования по умолчанию.

Тем не менее, это примерно A конструктор по умолчанию, с конструктором B по умолчанию вкод, который вы показали.

0 голосов
/ 25 ноября 2018

Ошибка возникает из-за того, что вы не указали B, как инициализировать его атрибуты A, поэтому он ищет конструктор A по умолчанию.

В C ++ инициализация атрибута выполняется как showМатье, а не в теле конструктора.Вы можете добавить конструктор A по умолчанию, но вам нужно подумать, соответствует ли это поведение вашего кода.

Компиляция приведенного ниже кода не выдает никакой ошибки.

class A {
public:
    int ID;

    A() {}

    A(int getID) {
        ID = getID;
    }
};

class B {
public:
    A someA;
    A someB;
    int number;

    B() {}

    B(A ObjectA, A ObjectB, int getNumber) {
        someA = ObjectA;
        someB = ObjectB;
        number = getNumber;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...