Используйте mysqlimport для загрузки таблицы в базу данных:
mysqlimport --ignore-lines=1 \
--fields-terminated-by=, \
--local -u root \
-p Database \
TableName.csv
Я нашел ее в http://chriseiffel.com/everything-linux/how -to-import-a-large-csv-file-to-mysql /
Чтобы сделать вкладку разделителя табуляцией, используйте --fields-terminated-by='\t'
Элемент center_pt
инициализируется по умолчанию, и такая операция вызывает конструктор по умолчанию no arguments Point()
. Однако это не определено в классе Point
и, следовательно, дает вам полученную вами ошибку.
Circle::Circle(const Point& center, double radius)
{
center_pt = center; //<-- this is an assignment
//default init has already occurred BEFORE this point
radius_size = radius;
}
Прежде чем вы сможете назначить center_pt
здесь, вам нужно что-то назначить. Поэтому компилятор пытается инициализировать center_pt
по умолчанию, прежде чем пытаться выполнить назначение.
Вместо этого, если вы используете список инициализаторов члена , вы можете избежать проблемы по умолчанию построение с последующим присваиванием:
Circle::Circle(const Point& center, double radius):
center_pt(center),
radius_size(radius)
{
}
Когда вы создаете класс, вы по существу выделяете память для хранения различных членов этого класса. Итак, представьте center_pt
и radius_size
как места в памяти, чтобы эти значения сохранялись для каждого экземпляра вашего класса. Когда вы создаете класс, эти переменные должны получать заданные значения по умолчанию, если вы не укажете ничего, что вы получите по умолчанию сконструированные значения, независимо от того, что это такое. Вы можете назначать значения позже этим местоположениям, но некоторые инициализации всегда будут возникать во время создания класса. Если вы используете список инициализаторов, вы можете явно указать, что будет помещено в память в первый раз.
Используя список инициализаторов членов, ваши члены создаются соответствующим образом в первый раз. Это также помогает экономить некоторые ненужные операции.
Это происходит потому, что вы не инициализируете член в списке инициализации, а назначаете его в теле. Следовательно, он сначала создает его, используя по умолчанию ctor, и, следовательно, жалобу вашего компилятора.
Рассмотрите возможность изменения:
// Circle.cpp
Circle::Circle(const Point& center, double radius) :
center_pt(center),
radius_size(radius)
{
}
Измените
Circle::Circle(const Point& center, double radius)
{
center_pt = center;
radius_size = radius;
}
на
Circle::Circle(const Point& center, double radius) : center_pt(center), radius_size(radius)
{
}
Так, чтобы он использовал конструктор, который вы определили для точки. Также лучше для радиуса
Измените конструктор следующим образом
Circle::Circle(const Point& center, double radius)
: center_pt( center ), radius_size( radius )
{
}
Проблема заключается в том, что если вы не будете явно вызывать конструктор с параметрами для класса Point
, то компилятор пытается вызвать конструктор по умолчанию класса для создания члена данных center_pt
класса Circle, прежде чем вы сможете назначить точку внутри тела конструктора класса Circle
. Но вы не определили конструктор по умолчанию класса Point
, и компилятор выпустил ошибку.
Другой подход действительно должен определить конструктор по умолчанию для класса Point
, который, например, инициализирует точку с нулями .
Учтите, что по дизайну класса Point
вы не можете изменять элементы данных coord_x
и coord_y
созданного объекта. Возможно, вы должны перепроектировать класс.
center_pt
иradius_size
как места в памяти, в которые эти значения будут сохранены. Когда происходит, когда вы создаете класс, это то, что эти переменные должны получать значения по умолчанию, если вы не укажете ничего, что вы получаете по умолчанию сконструированные значения, независимо от того, что есть. Вы можете назначить значения позже, но первый по умолчанию всегда будет размещен там первым. Если вы используете список инициализаторов, вы можете указать, что будет помещено в память в первый раз. – shuttle87 3 July 2015 в 17:02