Ошибка компилятора: нет подходящего конструктора по умолчанию - PullRequest
0 голосов
/ 24 октября 2019

Я делаю ООП в C ++ впервые. Я заметил, что это очень отличается от других языков, на которых я делал ООП в прошлом.

Пока все шло отлично, но я столкнулся с проблемой, когда мне нужен конструктор для получения объекта, который я создал в качестве параметра, и по некоторым причинам он отказывается компилироваться и выдает ошибки.

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

Вот файл заголовка, в который была выдана ошибка (Player.h):

#pragma once

// Header files
#include "Square.h"

class Player
{
private:
    // Private variables
    Square _position;

public:
    // Public constructors declarations
    Player(Square position);

    // Public functions declaration
    void setPosition(Square position);
    Square getPosition();
};

Вот файл CPP, в который была выдана ошибка (Player.cpp):

// Header files
#include "Player.h"

// Public constructors
Player::Player(Square position) // <---------- ERROR LOCATION
{
    _position = position;
}

// Public functions
void Player::setPosition(Square position)
{
    _position = position;
}

Square Player::getPosition()
{
    return _position;
}

На всякий случай, вот файл заголовка объекта параметра (Square.h):

#pragma once

class Square
{
private:
    // Private variables
    int _x;
    int _y;

public:
    // Public constructors declarations
    Square(int x, int y);

    // Public functions declaration
    void setX(int x);
    int getX();
    void setY(int y);
    int getY();
};

Здесь также находится файл CPP объекта параметра (Square.cpp)):

// Header files
#include "Square.h"

// Public constructors
Square::Square(int x, int y)
{
    _x = x;
    _y = y;
}

// Public functions
void Square::setX(int x)
{
    _x = x;
}

int Square::getX()
{
    return _x;
}

void Square::setY(int y)
{
    _y = y;
}

int Square::getY()
{
    return _y;
}

Вот ошибки, выданные компилятором:

В строке 4 файла 'Player.cpp':

Ошибка E0291:не существует конструктора по умолчанию для класса «Квадрат»

Ошибка C2512: «Квадрат»: нет подходящего конструктора по умолчанию, доступного

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Проблема в том, что Player::_position необходимо создать перед открывающей скобкой в ​​любом конструкторе Player. Вы можете

  1. Создать конструктор по умолчанию (тот, который можно вызывать без аргументов) для Square. Это может или не может подходить для вашей программы.
  2. Используйте список инициализатора. Это позволяет избежать проблем проектирования, если Square по какой-то причине не может иметь конструктор по умолчанию.

Решение со списком инициализаторов выглядит следующим образом:

Player::Player(Square position)
 : _position{position} { }
0 голосов
/ 24 октября 2019

Учитывая, что вы реализовали конструктор для Square, компилятор не реализует конструктор по умолчанию. Ваш единственный способ построить Square - это использовать определенный вами конструктор.

Как только вы объявили переменную-член Player Square _position, она должна каким-то образом инициализироваться в конструкторе Player. Однако компилятор не может использовать предоставленный вами конструктор.

Вы можете объявить конструктор по умолчанию самостоятельно:

Square() = default;

Код ошибки показан в первой строке конструкторапотому что компилятор пытается инициализировать каждый элемент Player перед выполнением тела конструктора, но не может найти подходящий способ для создания Square.

Другое решение - инициализировать элементпеременная напрямую с помощью предоставленного вами конструктора. Таким образом, компилятор будет использовать ваш конструктор при инициализации переменных-членов Player:

Square _position = Square(0,0)
0 голосов
/ 24 октября 2019

Похоже, конструктор по умолчанию неявно удален. Вы можете попробовать добавить тривиальный вариант следующим образом (как public в Square.h.

Square(): _x(0), _y(0){}
~Square(){}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...