2016-12-02 3 views
0

Я пытаюсь создать два простых класса, но по какой-то причине этот код не компилируется. Это говорит, что я вызываю point :: point без аргументов, но единственный раз, когда я вызываю point :: point, находится в основной функции, и я вызываю ее с помощью аргументов.Почему этот конструктор вызывает другое без аргументов?

При отладке я обнаружил, что это конструктор для string_two_points, который вызывает конструктор для точки.

#include <iostream> 
#include <string> 
using namespace std; 
class point{ 
public: 
    int x; 
    int y; 
    point(int x, int y): x(x),y(y){}; 
    point(const point & c): x(c.x), y(c.y) {}; 
    }; 

class string_two_points{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc):type(type){ 
     x=xc; 
    }; 
    string_two_points(string type, point & xc, point & yc):type(type){ 
     x=xc; 
     y=yc; 
    }; 

}; 

int main(){ 
    point a = point(2,3); 
    point b = point(3,4); 
    string_two_points x = string_two_points(string("abc"),a,b); 
    return 0; 
} 
+0

'' string_two_points' имеет точку х, 'в качестве члена. Поэтому, когда вы создаете 'string_two_points', он строит' x', который включает вызов конструктора 'x'. –

+0

Вы должны сообщить нам, где возникает жалоба компилятора. ctors часто вызываются по причинам, которые вы явно не кодировали. Вы показываете два ctors. Возможно, компилятор предоставил несколько других, включая по умолчанию ctor. –

+0

@ Компилятор DOUGLASO.MOEN не предоставляет конструктор по умолчанию, если имеется предоставленный пользователем конструктор –

ответ

2
string_two_points(string type, point & xc):type(type){ 

Этот конструктор не инициализирует point y, поэтому он получает по умолчанию инициализируется вызовом конструктора по умолчанию без параметров point::point (который не существует).

0

И конструкторы string_two_points пытаются вызвать конструктор по умолчанию point для x и y, а затем присвоить им что-то.
Это не так, потому что point() не существует как конструктор, как правильно упомянуто компилятором.

0

Поскольку класс string_two_points имеет point членов названных x и y, любая инициализация string_two_points должна включать в себя инициализацию x и y. Так как вы не описываете, как инициализировать их в списках членом инициализаторы конструкторов, компилятор автоматически добавляется инициализация по умолчанию, как если бы вы написали

string_two_points(string type, point & xc):type(type), x(), y() { 
    x=xc; 
}; 

Примечание x=xc; не является инициализация, это задание, которое происходит после того, как инициализация завершена.

+0

в зависимости от деталей класса, 'x()' может быть инициализацией значения, которая может иметь различное поведение для инициализации по умолчанию –

0

С string_two_points имеет двух элементов типа point, и ни одному из конструкторов не присвоено значение по умолчанию, компилятор должен их инициализировать. Для этого он пытается вызвать конструктор без параметров без параметров. Так как этого не существует, это порождает ошибку.

Вы можете исправить это путем инициализации членов в каждом конструкторе:

class string_two_points 
{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc) 
    : type(type), x(xc), y(0, 0) 
    { 
    }; 

    string_two_points(string type, point& xc, point& yc) 
    : type(type), x(xc), y(yc) 
    { 
    }; 
}; 
Смежные вопросы