2017-10-27 8 views
1

Domain2D이라는 사용자 정의 클래스를 갖고 싶다고 가정 해 봅시다. 도메인은 내부 벡터 Triangle의 벡터와 Boundary2D이라는 개체로 구성됩니다. Boundary2DLineSegment의 목록으로 구성되며 각 Triangle은 세 개의 V2 개체로 구성됩니다. 각 V2 개체는 두 개의 좌표로 구성됩니다.사용자 정의 클래스의 초기화 프로그램에 대한 C++ 혼동

다음은 과 같은 객체를 정의 할 수 있도록이 클래스의 V2 클래스와 생성자를 만듭니다. 기본값은 (0, 0)입니다.

class V2 { 
public: 
    long double x, y; 
    V2(long double xx = 0, long double yy = 0); 
}; 

V2::V2(long double X, long double Y) { 
    x = X; y = Y; 
} 

내가해야 할 다음 일은 선분입니다 :

class LineSegment { 
public: 
    V2 v1, v2; 
    LineSegment(V2 vv1 = V2(0, 0), V2 vv2 = V2(1, 0)); 
}; 

LineSegment::LineSegment(V2 VV1, V2 VV2) { 
    v1 = VV1; v2 = VV2; 
} 

기본 라인 세그먼트가 정점으로 구성 (0, 0)과 (1, 0). 그 때 나는 삼각형이 필요합니다

class Triangle { 
public: 
    V2 v1, v2, v3; 
    Triangle(V2 vv1 = V2(0, 0), V2 vv2 = V2(1, 0), V2 vv3 = V2(0, 1)); 
}; 

Triangle::Triangle(V2 VV1, V2 VV2, V2 VV3) { 
    v1 = VV1; v2 = VV2; v3 = VV3; 
} 

기본 삼각형 좌표를 2 차원 데카르트의 표준 단면으로 구성 (0, 0), (1, 0), (0, 1)은. 우리는 거의 우리는 단지 선 세그먼트로 구성된 경계해야 완료 :

class Boundary2D { 
public: 
    std::vector<LineSegment> l; 
    Boundary2D(std::vector<LineSegment> ll = {}); 
}; 

Boundary2D::Boundary2D(std::vector<LineSegment> lll) { 
    l = lll; 
} 

기본 경계가 비어 ({})입니다, 그래서 필요한 경우, 우리는 즉시 push_back(...) 거기에 있습니다.

마지막으로, 도메인 경계 구성되어 있으며, 삼각형의 벡터 : 컴파일러는 삼각형의 기본 빈 벡터 괜찮지 만, 그것은 나의 필요를 이해하지 않습니다

class Domain2D { 
public: 
    std::vector<Triangle> t; 
    Boundary2D b; 
    Domain2D(std::vector<Triangle> tt = {}, Boundary2D bb = Boundary2D({})); 
}; 

Domain2D::Domain2D(std::vector<Triangle> ttt, Boundary2D bb) { 
    t = ttt; b = bb; 
} 

지금 여기서 문제 야 기본 빈 경계는 Boundary2D bb = Boundary2D({})으로 초기화하려고했습니다. 그것은 <function-style-cast>: cannot convert from 'initializer list' to 'Boundary2D'라고합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이런 구조를 만드는 것은 나쁜 접근입니까? 경계면의 기본 이니셜 라이저를 기본적으로 비워 두려면 어떻게해야합니까? 감사.

+0

난 당신이 기본 인수 구성 복사 할 수 있다고 생각하지 않습니다. 이것은 작동합니다 :'Domain2D (std :: vector tt = {}, Boundary2D bb = {});' – Tobias

+0

Bundary2D는 이미 기본 생성자를 가지고 있으므로'Domain2D (std :: vector tt = {}, Boundary2D bb = Boundary2D ({}))'Domain2D (std :: vector tt = {}, Boundary2D bb)' – mnistic

+0

오 그 말이 맞아! 내가 왜 이걸 생각하지 않았 니? 불쌍한 내가 여기에 공간을 낭비하지 않을 것이라고 구글에서 나를 도울 것이 아무것도 찾을 수 없습니다. 설명 주셔서 대단히 감사합니다! – user16320

답변

1

는 참고로, 문제가되는 라인은 기본 인수와 함께 생성자를 선언하려고

Domain2D(std::vector<Triangle> tt = {}, Boundary2D bb = Boundary2D({})); 

입니다.

컴파일러 출력은 실제로는 매우 간단합니다. 말 그대로 C 스타일 캐스트를 사용하여 이니셜 라이저 목록 {}Boundary2D 유형의 객체로 변환하려고합니다. 이러한 변환 연산자가 정의되지 않은, 그것은

그냥 다음으로 대체 작동하지 않으며, 작동한다

Domain2D(std::vector<Triangle> tt = {}, Boundary2D bb = {}); 
관련 문제