Заголовочные файлы. так далее - PullRequest
1 голос
/ 24 марта 2011

Я определил простой класс. Определение находится в заголовочном файле, а имплементация - в файле cpp:

HEADER:

#ifndef POINT_H
#define POINT_H

class Point {
public:
    Point(int x, int y);

    int getX();
    int getY();

private:
    int x, y;
};

#endif

CPP

#include Point.h

Point::Point(int x=2, int y=2) {
    this->x = x;
    this->y = y;
}

int Point::getX() {
    return x;
}

int Point::getY() {
    return y;
}

Это не компилируется, и я не уверен почему. Кроме того, когда я хочу создать точку где-то еще, скажем main.cpp, что я #include вверху, просто Point.h? Если это так, как он узнает, как выглядеть в Point.cpp?

Ответы [ 5 ]

8 голосов
/ 24 марта 2011
#include Point.h 

Вам нужны кавычки около Point.h.

Point::Point(int x=2, int y=2) 

Аргументы по умолчанию должны быть в объявлении в заголовочном файле, а не в определении в файле .cpp (он будет скомпилирован как есть, но не будет делать то, что вы хотите).

На стилистической ноте обычно плохая идея называть локальные переменные или аргументы такими же, как переменные-члены: это может легко привести к путанице. Вы также можете инициализировать переменные-члены, используя список инициализаторов:

Point::Point(int x_, int y_) : x(x_), y(y_) { }

Поскольку ваш код в данный момент написан, x и y оба созданы, затем вы присваиваете им. Использование списка инициализаторов исключает назначение и просто создает их напрямую. Это не имеет значения для фундаментальных типов, таких как int, но имеет значение для типов классов.

Это не компилируется, и я не уверен, почему.

Обычно полезно сообщение об ошибке, которое выдает компилятор. Если ничего другого, если это не полезно для вас, это полезно для тех из нас, кто пытается помочь.

Кроме того, когда я хочу создать точку в другом месте, скажем main.cpp , что мне нужно #include вверху, просто Point.h ?

Да.

Как узнать, как выглядит Point.cpp?

Каждый записываемый вами файл .cpp компилируется в отдельный объектный файл. После того, как все файлы .cpp скомпилированы в объектные файлы, все эти объектные файлы объединяются в исполняемый файл (или библиотеку). Компоновщик выясняет, где все определено.

1 голос
/ 24 марта 2011

Вы определили значения по умолчанию для x и y в реализации. Это не может работать. Подумайте немного, как это должно работать, если клиенты вашего класса видят только заголовок и, следовательно, не подозревают, что могли бы вызвать Point без параметров по умолчанию?

Хитрость в том, что реализация компилируется в ваше приложение, и вызовы разрешаются с использованием только объявления (материал в заголовке). Для каждого вызова компилятор создает имя символа и отмечает его (например, когда вы вызываете Point :: getX, компилятор вставит вызов, который выглядит как call _getX@Point@). Компоновщик, который идет после компилятора, будет искать эту функцию. Если он реализован, он будет найден и вызывающий будет перенаправлен на исходный код Point::getX().

[Редактировать] Да, и вам нужно написать #include "Point.h".

1 голос
/ 24 марта 2011

В вашем включении отсутствуют кавычки

#include "Point.h"

В файле, в котором вы хотите создать экземпляр Point, вы должны указать Point.h

1 голос
/ 24 марта 2011

Вы должны поместить аргумент по умолчанию в заголовок, хотя без сообщения об ошибке я не могу сказать, если это ваша проблема. Также вы должны указать ваше включение #include "Point.h"

0 голосов
/ 24 марта 2011

Какую ошибку вы получаете?

Вы просто включаете файл .h:

#include "Point.h"

Компоновщик разрешает ссылки на код при сборке исполняемого файла.

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