Нет экземпляра конструктора? - PullRequest
0 голосов
/ 21 мая 2011

Я пытаюсь создать свой собственный класс Vector2D, аналогичный классу XNA, для хранения координат. Следуя примеру найденных конструкторов здесь , я создал код ниже.Тем не менее, я получаю сообщение об ошибке, говорящее, что не существует экземпляра конструктора "Vector2D :: Vector2D", который соответствует списку аргументов.Я не понимаю, как это может быть ... В чем проблема?

struct Vector2D {
    Vector2D(int *varX, int *varY);
    ~Vector2D();
    private: int *X, *Y;
};

Vector2D::Vector2D(int *varX, int *varY) {
    X = varX;
    Y = varY;
}

Vector2D::~Vector2D() {
    free(X);
    free(Y);

}

Ответы [ 4 ]

5 голосов
/ 21 мая 2011

Скорее всего, вы пытаетесь создать свой класс Vector2D следующим образом:

Vector2D vector(1, 2);

Вы не можете сделать это, используя указатели на int, как вы делали это в своем определении конструктора Vector2D, потому чтоэти значения не являются указателями, они являются целочисленными константами.Измените на простые int объекты, подобные этому:

struct Vector2D 
{
    Vector2D(int varX, int varY): X(varX), Y(varY) {}  //initialization list
    //~Vector2D();  delete the destructor since it's not needed anymore

    int X, Y;
};

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

Наконец, вы, вероятно, не хотите, чтобы ваши члены-данные были private, если вы используетеstruct ... вы можете сделать это, но затем вам нужно будет добавить некоторые функции для доступа к этим элементам данных (т. е. если вы объявите их private, вы не сможете делать такие вещи, как vector.x = 5;).Обычно вы используете class, если хотите использовать по умолчанию private доступ, так как struct по умолчанию public access.

2 голосов
/ 21 мая 2011

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

Я предполагаю, что ошибка произошла из-за

Vector2D v(3, 5);

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

0 голосов
/ 21 мая 2011

Кажется, проблема в том, что вы передаете int вместо указателей на int.

Если вы хотите сохранить параметры в виде указателей на целое число, вы должны передать параметры в виде указателей или создать новый тип int при передаче параметра следующим образом:

Vector2D v(new int(4), new int(8));

Как видите, я передаю в качестве параметров целые числа 4 и 8.

Будьте внимательны при уничтожении переменных, используя delete вместо free. Или вы также можете адаптировать проблему, используя malloc/free.

Здесь вам нужен деструктор, потому что вы выделяете пространство по требованию при передаче параметров.

0 голосов
/ 21 мая 2011

Проблема не в определении, а в том, как вы используете класс.Например, код, подобный следующему:

int main(){
    Vector2D v2D_none;
}

даст ошибку, о которой вы говорите, потому что нет конструктора по умолчанию (без параметров).Вызов Vector2D v2D(1,2) также не удастся из-за несоответствия типов.

Кроме того, наличие free в деструкторе - плохой выбор, как было отмечено в комментариях.В любом случае, почему вы используете указатели?

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