클래스 디자이너에서 C++ 코드 사용

클래스 디자이너에는 프로젝트의 코드 요소를 시각적으로 나타내 주는 클래스 다이어그램이라는 시각적 디자인 화면이 표시됩니다. 클래스 다이어그램을 사용하여 프로젝트의 클래스 및 기타 형식을 디자인하고 시각화할 수 있습니다.

클래스 디자이너에서 지원되는 C++ 코드 요소는 다음과 같습니다.

  • 클래스(상속 관계가 여러 개 있을 수 있다는 점을 제외하고는 관리되는 클래스의 모양과 비슷함)

  • 익명 클래스(익명 형식에 대해 클래스 뷰에서 생성된 이름이 표시됨)

  • 템플릿 클래스

  • 구조체

  • 열거형

  • 매크로(후처리된 매크로 뷰가 표시됨)

  • Typedef

참고 항목

이 UML 클래스 다이어그램에서 모델링 프로젝트를 만들 수 있습니다 수 없습니다. 자세한 내용은 UML 클래스 다이어그램: 참조를 참조하세요.

클래스 디자이너의 C++ 클래스

클래스 디자이너는 C++ 클래스를 지원하며, C++ 클래스가 여러 상속 관계를 포함한다는 점을 제외하고 Visual Basic 및 C# 클래스 모양과 동일한 방식으로 네이티브 C++ 클래스를 시각화합니다. 클래스 모양을 확장하여 추가 필드와 메서드를 클래스에 표시하거나 축소하여 공간을 절약할 수 있습니다.

참고 항목

클래스 디자이너는 공용 구조체(해당 데이터 멤버 중 가장 큰 데이터 멤버에 필요한 만큼만 메모리가 할당되는 특수한 클래스 형식)를 지원하지 않습니다.

단순 상속

둘 이상의 클래스를 클래스 다이어그램으로 끌면 클래스에는 클래스 상속 관계가 설정되고 화살표가 클래스를 연결합니다. 화살표는 기본 클래스의 방향을 가리킵니다. 예를 들어 다음 클래스가 클래스 다이어그램에 표시되면 화살표는 B에서 A를 가리키도록 클래스를 연결합니다.

class A {};
class B : A {};

클래스 B만 클래스 다이어그램으로 끌어 B에 대한 클래스 모양을 마우스 오른쪽 단추로 클릭한 다음 기본 클래스 표시를 클릭할 수도 있습니다. 그러면 기본 클래스가 A로 표시됩니다.

다중 상속

클래스 디자이너는 다중 클래스 상속 관계의 시각화를 지원합니다. 다중 상속은 파생 클래스에 둘 이상의 기본 클래스의 특성이 있을 때 사용됩니다. 다음은 다중 상속의 예입니다.

class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};

둘 이상의 클래스를 클래스 다이어그램으로 끌면 클래스에는 다중 클래스 상속 관계가 설정되고 화살표가 클래스를 연결합니다. 화살표는 기본 클래스의 방향을 가리킵니다.

클래스 모양을 마우스 오른쪽 단추로 클릭한 다음 기본 클래스 표시를 클릭하면 선택한 클래스에 대한 기본 클래스가 표시됩니다.

참고 항목

C++ 코드에는 파생 클래스 표시 명령이 지원되지 않습니다. 클래스 뷰로 이동하여 형식 노드를 확장하고 파생 형식 하위 폴더를 확장한 후 해당 형식을 클래스 다이어그램으로 끌어 파생 클래스를 표시할 수 있습니다.

다중 클래스 상속에 대한 자세한 내용은 다중 상속다중 기본 클래스를 참조하세요.

추상 클래스

클래스 디자이너는 추상 클래스(“추상 기본 클래스” 라고도 함)를 지원합니다. 추상 클래스는 인스턴스화하지는 않고 여기에서 다른 클래스를 파생할 수는 있는 클래스입니다. 이 문서 앞부분에 있는 “다중 상속”의 예제를 사용하여 Bird 클래스를 개별 개체로 인스턴스화할 수 있습니다.

int main()
{
   Bird sparrow;
   Bird crow;
   Bird eagle;
}

그러나 Swimmer 클래스를 개별 개체로 인스턴스화하지 않을 수도 있습니다. 예를 들어 Penguin, Whale, Fish와 같은 동물 클래스 형식만 파생할 수 있습니다. 이 경우에는 Swimmer 클래스를 추상 기본 클래스로 선언할 것입니다.

클래스를 추상으로 선언하려면 abstract 키워드를 사용할 수 있습니다. abstract로 표시되거나 추상 클래스에 포함된 멤버는 가상의 멤버이며, 추상 클래스에서 파생된 클래스에 의해 구현되어야 합니다.

class Swimmer abstract
{
   virtual void swim();
   void dive();
};

순수 가상 함수를 하나 이상 포함하여 클래스를 abstract로 선언할 수도 있습니다.

class Swimmer
{
   virtual void swim() = 0;
   void dive();
};

이러한 선언을 클래스 다이어그램에 표시하면 클래스 이름 Swimmer 및 그 순수 가상 함수 swim추상 클래스라는 표기와 함께 가상 클래스 모양에 기울임꼴로 표시됩니다. 추상 클래스 형식 모양은 테두리가 점선인 점을 제외하고 일반 클래스와 동일합니다.

추상 기본 클래스에서 파생 클래스는 기본 클래스의 각 순수 가상 함수를 재정의해야 합니다. 그렇지 않으면 파생 클래스를 인스턴스화할 수 없습니다. 따라서 예를 들어 Swimmer 클래스에서 Fish 클래스를 파생하면 Fishswim 메서드를 재정의해야 합니다.

class Fish : public Swimmer
{
   void swim(int speed);
};

int main()
{
   Fish guppy;
}

이 코드를 클래스 다이어그램에 표시하면 클래스 디자이너Fish에서 Swimmer까지 상속 선을 그립니다.

익명 클래스

클래스 디자이너는 익명 클래스를 지원합니다. 익명 클래스 형식은 식별자 없이 선언된 클래스입니다. 익명 클래스는 생성자나 소멸자를 가질 수 없고, 인수로서 함수에 전달될 수 없으며, 함수에서 반환 값으로서 반환될 수 없습니다. 다음 예제와 같이 익명 클래스를 사용하여 클래스 이름을 Typedef 이름으로 바꿀 수 있습니다.

typedef struct
{
    unsigned x;
    unsigned y;
} POINT;

구조체는 익명일 수도 있습니다. 클래스 디자이너는 익명 클래스와 구조체를 해당 형식을 표시할 때와 같이 표시합니다. 익명 클래스와 구조체를 선언하고 표시할 수 있지만 클래스 디자이너는 사용자가 지정한 태그 이름을 사용하지 않습니다. 클래스 뷰가 생성하는 이름을 사용합니다. 클래스 또는 구조체는 클래스 뷰 및 클래스 디자이너에서 __unnamed라는 요소로 나타납니다.

익명 클래스에 대한 자세한 내용은 익명 클래스 형식을 참조하세요.

템플릿 클래스

클래스 디자이너는 템플릿 클래스의 시각화를 지원합니다. 중첩된 선언도 지원합니다. 다음 표는 몇 가지 일반적인 선언을 보여 줍니다.

코드 요소 클래스 디자이너 보기
template <class T>

class A {};
A<T>

템플릿 클래스
template <class T, class U>

class A {};
A<T, U>

템플릿 클래스
template <class T, int i>

class A {};
A<T, i>

템플릿 클래스
template <class T, template <class K> class U>

class A {};
A<T, U>

템플릿 클래스

다음 표는 부분 특수화의 몇 가지 예를 보여 줍니다.

코드 요소 클래스 디자이너 보기
template<class T, class U>

class A {};
A<T, U>

템플릿 클래스
template<class T>

class A<T, T> {};
A<T, T>

템플릿 클래스
template <class T>

class A<T, int> {};
A<T, int>

템플릿 클래스
template <class T1, class T2>

class A<T1*, T2*> {};
A<T1*, T2*>

템플릿 클래스

다음 표는 부분 특수화에서 상속의 몇 가지 예를 보여 줍니다.

코드 요소 클래스 디자이너 보기
template <class T, class U>

class A {};

template <class TC>

class A<T, int> {};

class B : A<int, float>

{};

class C : A<int, int>

{};
A<T, U>

템플릿 클래스

B

클래스

(클래스 A를 가리킴)

C

클래스

(클래스 A를 가리킴)

다음 표는 부분 특수화 템플릿 함수의 몇 가지 예를 보여 줍니다.

코드 요소 클래스 디자이너 보기
class A

{

template <class T, class U>

void func(T a, U b);

template <class T>

void func(T a, int b);

};
A

func<T, U>(+1 오버로드)
template <class T1>

class A {

template <class T2>

class B {};

};

template<> template<>

class A<type>::B<type> {};
A<T1>

템플릿 클래스

B<T2>

템플릿 클래스

(B는 클래스 A의 중첩 형식에 포함됨)
template <class T>

class C {};

class A : C<int> {};
A

클래스

-> C<int>

C<T>

템플릿 클래스

다음 표는 템플릿 상속의 몇 가지 예를 보여 줍니다.

코드 요소 클래스 디자이너 보기
template <class T>

class C {};

template<>

class C<int> {

class B {};

}

class A : C<int>::B {};
A

클래스

->B

C<int>

클래스

(B는 클래스 C의 중첩 형식에 포함됨)

C<T>

템플릿 클래스

다음 표는 정식 특수 클래스 연결의 몇 가지 예를 보여 줍니다.

코드 요소 클래스 디자이너 보기
template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};
A

클래스

->C<int>

C<int>

클래스

C<T>

템플릿 클래스

D

클래스

->C<float>
class B {

template <class T>

T min (const T &a, const T &b);

};
B

min <T>

클래스 디자이너의 C++ 열거형

클래스 디자이너는 C++ enum 및 범위가 지정된 enum class 형식을 지원합니다. 다음은 예제입니다.

enum CardSuit {
   Diamonds = 1,
   Hearts = 2,
   Clubs = 3,
   Spades = 4
};

// or...
enum class CardSuit {
   Diamonds = 1,
   Hearts = 2,
   Clubs = 3,
   Spades = 4
};

클래스 다이어그램의 C++ 열거형 도형은 레이블이 Enum 또는 Enum 클래스로 표시되고, 파란색이 아니라 분홍색이며, 왼쪽 및 위쪽 여백에 색이 지정된 테두리가 있다는 점을 제외하고 구조체 도형과 모양 및 기능이 유사합니다. 열거형 도형과 구조체 도형에는 사각형 모서리가 있습니다.

enum 형식을 사용하는 방법에 대한 자세한 내용은 열거형을 참조하세요.

클래스 디자이너의 C++ 형식 정의

Typedef 문은 이름과 기본 형식 간에 하나 이상의 간접 참조 레이어를 만듭니다. 클래스 디자이너typedef 키워드로 선언된 C++ typedef 형식을 지원합니다. 예:

typedef class coord
{
   void P(x,y);
   unsigned x;
   unsigned y;
} COORD;

그런 다음 이 형식을 사용하여 인스턴스를 선언할 수 있습니다.

COORD OriginPoint;

클래스 및 구조체 도형

클래스 디자이너에서 C++ typedef는 typedef에서 지정된 형식의 도형입니다. 소스에서 typedef class를 선언하는 경우 도형에 둥근 모서리와 클래스 레이블이 있습니다. typedef struct의 경우 도형에 사각형 모서리와 구조체 레이블이 있습니다.

클래스와 구조체에는 그 안에 선언된 typedef가 중첩되어 있을 수 있습니다. 클래스 디자이너에서 클래스 및 구조체 모양은 중첩된 typedef 선언을 중첩된 도형으로 표시할 수 있습니다.

Typedef 도형은 오른쪽 클릭 메뉴(상황에 맞는 메뉴)에서 형식 연결로 표시컬렉션 형식 연결로 표시 명령을 지원합니다.

Typedef 클래스 예제

class B {};
typedef B MyB;

C++ class typedef in Class Designer

구조체 typedef 예제

typedef struct mystructtag
{
    int   i;
    double f;
} mystruct;

C++ struct typedef in Class Designer

명명되지 않은 typedef

클래스 디자이너는 이름 없이 typedef를 선언할 수 있지만 지정한 태그 이름을 사용하지 않습니다. 클래스 디자이너클래스 뷰가 생성하는 이름을 사용합니다. 예를 들어 다음 선언은 유효하지만 클래스 뷰클래스 디자이너__unnamed라는 개체로 나타납니다.

typedef class coord
{
   void P(x,y);
   unsigned x;
   unsigned y;
};

참고 항목

클래스 디자이너는 소스 형식이 함수 포인터인 typedef를 표시하지 않습니다.

C++ 코드 요소의 제한 사항에 대해 알아보기

  • C++ 프로젝트가 로드되면 클래스 디자이너는 읽기 전용 방식으로 작동합니다. 즉, 클래스 다이어그램을 변경할 수 있지만 클래스 다이어그램에서 변경한 내용을 소스 코드에 저장할 수는 없습니다.

  • 클래스 디자이너에서는 네이티브 C++ 의미 체계만 지원됩니다. 관리 코드로 컴파일된 C++ 프로젝트의 경우 클래스 디자이너에는 네이티브 형식인 코드 요소만 시각화됩니다. 따라서 프로젝트에 클래스 다이어그램을 추가할 수는 있지만 IsManaged 속성이 true로 설정된 요소, 즉 값 형식과 참조 형식은 클래스 디자이너에 시각화되지 않습니다.

  • C++ 프로젝트의 경우 클래스 디자이너에서는 형식의 정의만 읽습니다. 예를 들어 헤더 파일(.h)에 형식을 정의하고 해당 멤버는 구현 파일(.cpp)에 정의할 경우, 구현 파일(.cpp)에서 "클래스 다이어그램 보기"를 호출하면 클래스 디자이너에 아무 것도 표시되지 않습니다. 또 다른 예로, #include 명령문을 사용하여 다른 파일을 포함하지만 실제 클래스 정의는 포함하지 않는 .cpp 파일에서 "클래스 다이어그램 보기"를 호출할 경우에도 클래스 디자이너에 아무 것도 표시되지 않습니다.

  • COM 인터페이스와 형식 라이브러리를 정의하는 IDL 파일(.idl)은 네이티브 C++ 코드로 컴파일되기 전까지는 다이어그램에 표시되지 않습니다.

  • 클래스 디자이너에서는 전역 함수 및 변수가 지원되지 않습니다.

  • 클래스 디자이너에서는 공용 구조체가 지원되지 않습니다. 공용 구조체는 해당 데이터 멤버 중 가장 큰 데이터 멤버에 필요한 만큼만 메모리가 할당되는 특수한 클래스 형식입니다.

  • 클래스 디자이너에서는 int, char 등의 기본 데이터 형식이 표시되지 않습니다.

  • 클래스 디자이너에서는 현재 프로젝트에 프로젝트 외부에 정의된 형식에 대한 올바른 참조가 없을 경우 해당 형식이 표시되지 않습니다.

  • 클래스 디자이너에서 중첩된 형식을 표시할 수는 있지만 중첩된 형식과 기타 형식 사이의 관계는 표시할 수 없습니다.

  • 클래스 디자이너에서는 void 형식이거나 void 형식에서 파생된 형식을 표시할 수 없습니다.

형식 확인 및 표시 문제 해결

소스 파일의 위치

클래스 디자이너에서는 소스 파일의 위치를 추적하지 않습니다. 따라서 프로젝트 구조를 수정하거나 프로젝트의 소스 파일을 이동하면 특히 형식 정의, 기본 클래스 또는 형식 연결의 소스 형식에 대해 클래스 디자이너에서 해당 형식을 추적할 수 없게 됩니다. 클래스 디자이너에서 이 형식을 표시할 수 없습니다.와 같은 오류가 발생할 수 있습니다. 이러한 오류가 발생하면 수정되거나 위치가 변경된 소스 코드를 클래스 다이어그램으로 끌어서 다시 표시합니다.

업데이트 및 성능 문제

C++ 프로젝트의 경우 소스 파일의 변경 내용이 클래스 다이어그램에 나타나는 데는 30~60초가 소요될 수 있습니다. 이 시간 지연으로 인해 클래스 디자이너에서 선택한 항목에서 형식을 찾을 수 없습니다라는 오류를 throw할 수도 있습니다. 이와 같은 오류가 발생하면 오류 메시지에서 취소를 클릭하고 클래스 뷰에 해당 코드 요소가 나타날 때까지 기다립니다. 그런 후에 클래스 디자이너에서 해당 형식이 표시될 수 있습니다.

코드에서 변경한 내용으로 클래스 다이어그램이 업데이트되지 않으면 다이어그램을 닫았다가 다시 열어 보세요.

형식 확인 문제

클래스 디자이너에서는 다음과 같은 경우에 형식을 확인할 수 없습니다.

  • 클래스 다이어그램이 속한 프로젝트에서 참조되지 않는 프로젝트나 어셈블리에 형식이 있습니다. 이 오류를 수정하려면 해당 형식을 포함하는 프로젝트나 어셈블리에 대한 참조를 추가합니다. 자세한 내용은 프로젝트의 참조 관리를 참조하세요.

  • 형식이 올바른 범위에 있지 않아 클래스 디자이너에서 해당 형식을 찾을 수 없습니다. 이 경우 코드에 using, imports 또는 #include 문이 누락되지 않았는지 확인합니다. 또한 해당 형식이나 관련 형식을 원래 있던 네임스페이스 밖으로 이동하지 않았는지 확인합니다.

  • 형식이 존재하지 않거나 주석 처리되었습니다. 이 오류를 해결하려면 해당 형식을 주석으로 처리하거나 삭제하지 않았는지 확인합니다.

  • 형식은 #import 지시문을 사용하여 참조되는 라이브러리에 있습니다. 가능한 해결 방법은 생성된 코드(.tlh 파일)를 헤더 파일에 대한 #include 지시문에 수동으로 추가하는 것입니다.

  • 입력한 형식이 클래스 디자이너에서 지원되는지 확인합니다. C++ 코드 요소의 제한 사항 을 참조하세요.

형식 확인 문제의 경우 가장 발생하기 쉬운 오류는 클래스 다이어그램 ‘<element>’에서 하나 이상의 모양에 대한 코드를 찾을 수 없습니다.입니다. 이 오류 메시지가 반드시 코드에 오류가 있음을 나타내지 않습니다. 클래스 디자이너는 코드를 표시할 수 없습니다 것을 나타냅니다. 다음과 같은 방법을 시도해 보세요.

  • 해당 형식이 존재하는지 확인합니다. 실수로 주석으로 처리했거나 소스 코드를 삭제했는지 확인합니다.

  • 형식을 확인해 보세요. 프로젝트 또는 클래스 다이어그램이 속한 프로젝트에서 참조되지 않는 어셈블리 형식이 있을 수 있습니다. 이 오류를 수정하려면 해당 형식을 포함하는 프로젝트나 어셈블리에 대한 참조를 추가합니다. 자세한 내용은 프로젝트의 참조 관리를 참조하세요.

  • 클래스 디자이너에서 찾을 수 있도록 형식이 올바른 범위에 있는지 확인하세요. 이 경우 코드에 using, imports 또는 #include 문이 누락되지 않았는지 확인합니다. 또한 해당 형식이나 관련 형식을 원래 있던 네임스페이스 밖으로 이동하지 않았는지 확인합니다.

추가 문제 해결 정보는 클래스 디자이너 오류를 참조 하세요.