2012-09-24 2 views
-5

다음 클래스가 monomorphic 경우 말해 주시겠습니까?C++ 단일 형 클래스 란 무엇입니까?

무엇이 단일체가됩니까? 단조는 실제로 무엇을 의미합니까?

class Foo 
{ 
public: 
    Foo(int n) 
    { 
     this->m = n; 
    } 

    void print() 
    { 
     std::cout << this->m << std::endl; 
    } 

private: 
    int m; 
}; 

편집 :

class Boo 
{ 
public: 
    Boo& Boo::operator=(const Boo &boo) 
    { 
    *foo1 = *boo.foo1; 
    *foo2 = *boo.foo2; 

    return *this; 
    } 

private: 
    Foo* foo1; 
    Foo* foo2; 
}; 
+7

어떻게 하나 단형를 정의 할 것인가? 나는 당신이 대수학의 속성을 언급하고 있다고 생각하지 않는다 : http://en.wikipedia.org/wiki/Monomorphism, 그러나 나는 다른 곳에서 사용 된 용어를 본 적이 없다. –

+0

C++은 Java 또는 PHP와 다릅니다. 생성자는 대개 C++에서 매우 다르게 작성됩니다. –

+2

부와이 시나리오에서 foo와는 어떤 관계가 있습니까? –

답변

7

먼저,이 질문에 대답하기 위해, 우리는 monomorphic 정말 무엇을 의미하는지 조사 할 필요가 : 클래스 우우의 맥락에서

. 이를 위해,의 단어 분해하자 : 우리가 가정하면, 그래서

 
mono - morphic 

을 그 모노 = 하나형태 적 = 변형 가능한 (적어도이 - 예를 들어, 사전 의미를 나를 이상 죽이지 마세요)

그래서, 우리는 많은 것을 의미하는이 걸릴 수 있습니다, 여기 내 머리 위로 떨어져 몇 가지 :

    우리의 클래스는 한 번만 변경할 수 있습니다
  1. 아니면이 다형성에 반대
  2. 마지막으로 (가 서브 클래스 될 수 없음을 의미)로 사용될 수, 그것은 수학의 속성을 참조 할 수 : 그래서 http://en.wikipedia.org/wiki/Monomorphism

을, 그 대답 3가 아니라고 가정 우리가 찾고있는 것 (어떤 경우에는 그 기사가 혼란 스럽기 때문에 더 나은 답을 찾아야합니다), 하나와 둘을 밟아 봅시다.

1. 우리의 클래스는이 가능성이 가장 높은 의미입니다, 제 생각에는 한 번

변경 될 수 있습니다. 첫눈에, 당신의 객체는 monomorphic입니다. 이것은 생성자 (지정된 생성자 또는 내장 된 복사 생성자)를 통해서만 한 번만 변경할 수 있다는 것을 의미합니다.

메모리가 읽기 - 쓰기 인 모든 컴퓨터에서 원하는 경우/할 수있는 거의 항상 수동으로 비트를 메모리에 설정하는 방법이 있기 때문에 이것은 사실 일 수 없습니다.

그러나, 당신이 제공하는 인터페이스를 사용하여, 그 시나리오에서 금지하고 예, 당신의 클래스는 단지 생성자를 통해 설정 한 회원 (m)의 점에서 단형입니다.

2. 우리의 클래스는

이것에 대한 대답은 조금 복잡 다형성이 아니다. 대부분의 언어와 달리 C++에는 두 가지 형태의 다형성이 있습니다. 전통적인 OO 의미에서 서브 클래스에 의해 덮어 쓰여지는 함수를 생성하는 기능을 가지고 있는데, 이는 virtual으로 표시됩니다. 그러나 이것을하지는 마십시오. 따라서 OO 다형성은 여러분의 클래스에서 가능하지 않습니다.

그러나 이전에 말한 것처럼 C++에는 여러 유형의 다형성이 있습니다.두 번째 유형은 (주로 반복자의 경우) STL 전반에 걸쳐 사용되는 template polymorphism 또는 function polymorphism,라고, 그것은 조금 다음과 같이 작동합니다 :

완벽하게 유효한 인터페이스입니다
template<typename aImpl> 
void printA(const aImpl &a) 
{ 
    a.print(); 
} 

class A { 
    public: 
    void print() { puts("I'm in A!"); } 
};  

, 그것은으로 작동합니다 예상했다. 분명히 다른 값을 출력 할

class B { 
    public: 
    void print() { puts("I'm in B!"); } 
}; 

그러나, 함수에 배치되는 다음 클래스를 방지하기 위해 아무것도 없다.

결국 C++는 복잡한 언어이므로 클래스가 다형성이 될 수 없도록하려면 모든 멤버와 함수를 비공개로 설정해야합니다. 그러면 첫 번째 클래스에 개체가있는 목적을 무효화 할 수 있습니다. 장소.

+0

http://bit.ly/Urf585 – Edward83

+0

* morphic *은 "변형 가능"이 아니라 폼이나 모양과 관련이 있음을 나타내는 링크. * Monomorphic *은 "하나의 형태 또는 모양을 가짐"을 의미합니다. – juanchopanza

+0

답변 해 주셔서 감사합니다. – Edward83

1

"monomorphic"이라는 용어가 1997 년부터 The Anatomy of the Assignment Operator 인 C++ 언어의 문맥에서 사용 된이 기사가 나왔습니다.이 용어는 C++ 서클에 떠 다니는 것을 암시하는 다른 곳에서는 거의 사용되지 않는 것으로 보입니다 90 년대에는 많은 견인력을 얻지 못했고 더 이상 사용되지 않습니다.

는 다음 클래스 정의를 고려해 다음과 같이

질문은 :이 기사는 상태 당신은 클래스가

class TFoo : public TSuperFoo { 
    TBar* fBar1; 
    TBar* fBar2; 
    // various method definitions go here... 
} 

, TFoo, 클래스에서 TSuperFoo을 내려하고 두 개의 데이터 멤버를 가지며 두 개체 모두 클래스 TBar의 개체에 대한 포인터입니다. 이 연습의 목적을 위해 포인터 이 의미를 소유하고 TBar단일 양식 클래스이 될 것으로 간주하십시오. 이 클래스에 대해 할당 연산자를 작성하십시오.

다양한 사전 정의를 보면 루트 "morphic"은 "특정 형태 또는 모양을 가짐"으로 정의되며 일반적으로 폴리 (다형성) 또는 호모 동형 이죠.

접두사 "모노"는 "단일"또는 "하나"또는 "혼자"로 정의되며 대개 "비행기"(모노 평면 또는 단일 날개 비행기) 또는 "레일"(모노레일)과 같은 접미사와 함께 사용됩니다 또는 단일 레일 또는 트랙).

"monomorphic"(단일 양식)은 "다형성"(많은 형태로되어 있음)의 반대 개념으로 사용되고 있습니다. 단일 형 클래스는 다른 클래스의 기본 클래스로 사용되지 않으며 다른 클래스에서 파생되지 않습니다.

monomorphic 클래스의보다 엄격한 정의는 클래스가 단일 형 클래스 만 사용하거나 데이터 형식으로 작성되어야한다는 것입니다. 단일 형 클래스는 정의 또는 동작의 일부로 다형성 클래스를 포함하지 않아야합니다.

엄격한 monomorphic 클래스가 템플릿 변수 또는 메서드를 포함 할 수 있는지 여부에 대한 질문이 제기됩니다. 내 첫 번째 직관은 템플릿이 단조로운 클래스를 생성하는 한 괜찮습니다. 다른 말로하면, 컴파일러가 여러분을 위해 단일 형 클래스를 작성하고 있다면, 행 아래의 Sally가 행을 써 넣은 것처럼 Sally와 같습니다.

그래서 엄격한 정의는 런타임 다형성을 배제해야합니까?

그래서 의도되지 않는다는 것을 암시, 그것은 다른 클래스에서 파생하지 않으며이 virtual 소멸자가 않기 때문에 문제의 클래스 Foo이 단형이다 단형 클래스의 첫 번째, 덜 엄격한 정의에 의해 그렇게 보일 수있을 것입니다 다른 클래스를 파생시키는 데 사용되도록하지 않으며 어떤 virtual 메서드도 가지고 있지 않습니다.

그러나 print() 방법에서 std::cout을 사용하고 std::cout은 확실히 다형성입니다. 아마도 polymorphic 클래스를 사용하기 때문에 semi-monomorphic 클래스라고 주장하는 것이 더 정확할까요?

monomorphic 클래스가 단독으로 나타납니다. 그러나 클래스를 작성하여 혼자 서서 컴파일러가이 클래스에서 다른 클래스를 파생시키려는 시도를 플래그하는 방법은 무엇입니까?

C++은 기존 클래스에서 새 클래스를 파생함으로써 클래스가 다른 클래스의 수퍼 클래스가되도록합니다. 가능한 많은 것들에 대해서는 매우 복잡한 규칙들이 있지만 다형성이 어떻게 성공적으로 작동하는지 궁극적으로는 final 키워드를 사용하여 (C++ 11) 클래스를 다른 클래스에서 만드는 유일한 합리적인 방법입니다 클래스를 파생시킬 수 없습니다.

잠깐 살펴본 결과 Simulating final class in C++private 생성자와 virtual 상속을 사용하는 방법을 제공합니다.

/* A program without any compilation error to demonstrate that instances of 
    the Final class can be created */ 
#include<iostream> 
using namespace std; 

class Final; 

class MakeFinal 
{ 
private: 
    MakeFinal() { cout << "MakeFinal constructor" << endl; } 
    friend class Final; 
}; 

class Final : virtual MakeFinal 
{ 
public: 
    Final() { cout << "Final constructor" << endl; } 
}; 

int main(int argc, char *argv[]) 
{ 
    Final f; 
    return 0; 
} 
+0

답장을 보내 주셔서 감사합니다, Richard. 매우 흥미로운! – Edward83