нет соответствующей функции для вызова конструктора [duplicate]

Используйте 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'

5
задан nonremovable 3 July 2015 в 16:48
поделиться

4 ответа

Элемент 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 как места в памяти, чтобы эти значения сохранялись для каждого экземпляра вашего класса. Когда вы создаете класс, эти переменные должны получать заданные значения по умолчанию, если вы не укажете ничего, что вы получите по умолчанию сконструированные значения, независимо от того, что это такое. Вы можете назначать значения позже этим местоположениям, но некоторые инициализации всегда будут возникать во время создания класса. Если вы используете список инициализаторов, вы можете явно указать, что будет помещено в память в первый раз.

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

9
ответ дан shuttle87 22 August 2018 в 19:40
поделиться
  • 1
    Спасибо. Итак, когда я инициализирую элементы перед входом в тело конструктора, компилятор «кладет его на backburner», так сказать, что касается построения center_pt? – nonremovable 3 July 2015 в 16:59
  • 2
    Когда вы создаете класс, вы по существу выделяете память для хранения различных членов внутри этого класса. Итак, представьте center_pt и radius_size как места в памяти, в которые эти значения будут сохранены. Когда происходит, когда вы создаете класс, это то, что эти переменные должны получать значения по умолчанию, если вы не укажете ничего, что вы получаете по умолчанию сконструированные значения, независимо от того, что есть. Вы можете назначить значения позже, но первый по умолчанию всегда будет размещен там первым. Если вы используете список инициализаторов, вы можете указать, что будет помещено в память в первый раз. – shuttle87 3 July 2015 в 17:02
  • 3
    Спасибо, это имеет смысл. – nonremovable 3 July 2015 в 17:04
  • 4
    Рад, что это помогло, я отредактировал это в своем ответе, поскольку я думаю, что действительно важно понять, что происходит на более глубоком уровне. – shuttle87 3 July 2015 в 17:06

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

Рассмотрите возможность изменения:

// Circle.cpp
Circle::Circle(const Point& center, double radius) :
    center_pt(center),
    radius_size(radius)
{

}
2
ответ дан Ami Tavory 22 August 2018 в 19:40
поделиться

Измените

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)
{
}

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

1
ответ дан Ed Heal 22 August 2018 в 19:40
поделиться

Измените конструктор следующим образом

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 созданного объекта. Возможно, вы должны перепроектировать класс.

5
ответ дан Vlad from Moscow 22 August 2018 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: