Невозможно преобразовать аргумент 1 из 'Object *' в 'const int - PullRequest
0 голосов
/ 19 марта 2020

Я хочу создать простую программу, которая демонстрирует использование этого. Я написал функцию, которая печатает переменные x и y. Я определил функцию в верхней части файла. Я даже не знаю, зачем это нужно, но хорошо. Все идет нормально. Visual Studio не находит проблем, никаких предупреждений и ошибок. Однако, когда я компилирую этот код, я получаю следующее сообщение об ошибке:

1> D: \ Dev \ Visual Studio Projekte \ Projektmappe \ FirstProject \ src \ This. cpp (3,30): ошибка C2143: синтаксическая ошибка: отсутствует ',' перед '*' 1> D: \ Dev \ Visual Studio Projekte \ Projektmappe \ FirstProject \ src \ This. cpp (11,1): ошибка C2664: «void PrintObject (const int)»: невозможно преобразовать аргумент 1 из «Object *» в 'const int'

Теперь в какой-то момент я также получил ошибку, что не определен конструктор по умолчанию. Однако компилятор предоставляет одно право? Затем я просто повторно набрал код, и ошибка исчезла. Просто то, что я хотел упомянуть, тоже казалось глупым. Так почему же компилятор думает, что «this» ссылается на «const int», когда он фактически ссылается на мой объект?

#include <iostream>

void PrintObject(const Object* o);

class Object {
public:
    int x, y;

    Object(int x, int y)
        : x(x), y(y) {
        PrintObject(this);
    }


    int GetX() const {
        return this->x;
    }

    int GetXy() const {
        return x;

    }

};

void PrintObject(const Object* o) {
    std::cout << o->x << ", " << o->y << std::endl;
}

int main() {


    std::cin.get();
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 19 марта 2020
void PrintObject(const Object* o);

Вы еще не объявили Object, поэтому компилятор не может знать, что это такое. Вы должны сначала объявить класс перед отключением этой функции. Технически, они оба могут быть объявлены одновременно, но это не очень популярный стиль.

Я также получил ошибку, что конструктор по умолчанию не определен. Тем не менее, компилятор предоставляет одно право?

Это не обеспечивает один. Конструктор по умолчанию предоставляется только для классов, в которых нет объявленных пользователем конструкторов (и нет конструктивных дочерних объектов, отличных от заданных по умолчанию).

1 голос
/ 19 марта 2020

Это достаточно просто, вы используете Object, прежде чем объявить его. Таким образом, компилятор не знает, что такое Object, в то время как он читает объявление PrintObject.

Два возможных решения.

1) Переместите объявление PrintObject после определения Object.

class Object
{
    ...
};

void PrintObject(const Object* o);

2) Используйте предварительное объявление , чтобы сообщить компилятору, что Object - это название класса.

class Object; // forward declaration

void PrintObject(const Object* o);

class Object
{
    ...
};
0 голосов
/ 19 марта 2020

PrintObject может быть определен как функция-член. Синтаксис станет намного приятнее.

#include <iostream>

class Object {
public:
    Object(int x, int y)
        : x(x), y(y) {
        PrintObject();
    }


    int GetX() const {
        return this->x;
    }

    int GetXy() const {
        return x;
    }

    void PrintObject() const {
        std::cout << x << ", " << y << std::endl;
    }
private:
    int x, y;
};


int main() {
    Object o{5,6};

    return 0;
}

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

...