2012-09-24 89 views
-5

請告訴我,如果下面的類是單形的?什麼是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

在這種情況下,boo與foo有什麼關係? –

回答

7

首先,爲了回答這個問題,我們需要檢查什麼monomorphic的真正含義。要做到這一點,讓我們打破了一句話:

 
mono - morphic 

因此,如果我們假設單=一個的Morphic =變形(至少在這個例子 - 不殺我了字典語義)

因此,我們可以認爲這意味着很多東西,這裏有幾個把我的頭頂部:

  1. 我們班只能變更一次
  2. 或者,它可能被用作相反多態性(這意味着它不能派生子類)
  3. 最後,它可能是指數學的性質:http://en.wikipedia.org/wiki/Monomorphism

因此,假設這個問題的答案3是不我們正在尋找的東西(在這種情況下,您必須找到更好的答案,因爲這篇文章很混亂),讓我們一步一步。

1.我們班一次只能

改變在我看來,這是最有可能的意思。乍一看,你的對象是單形,這意味着它只能通過構造函數(是指定的構造函數或內置的拷貝構造函數)更改一次。

在任何具有可讀寫內存的計算機中,這不可能是真實的,因爲如果需要,幾乎總是有辦法手動設置內存中的位。

然而,從場景限制,使用你提供的接口,那麼,你的類是單型,它的成員(m)只能通過構造方法設置。

2.我們班不是多態

這個問題的答案之一是有點複雜。與大多數語言不同,C++有兩種形式的多態。在傳統的OO意義上,它具有創建被子類覆蓋的功能的能力,其將被標記爲virtual。但是,您不這樣做,所以OO多態性不適用於您的類。

但是,正如我前面所說,C++中有多種可用的多態。第二類被稱爲template polymorphismfunction polymorphism,這是整個STL(主要用於迭代器)使用,它的工作原理有點像這樣:

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 *表示與形式或形狀相關,而不是「可轉換的」。 *單形*意味着「有一種形式或形狀」。 – juanchopanza

+0

謝謝你的回答! – Edward83

1

我遇到了這篇文章,其中術語「monomorphic」用於C++語言The Anatomy of the Assignment Operator從1997年的上下文中。該術語似乎很少用於其他地方,這意味着它可能已經在C++圈中浮動在90年代,但沒有獲得太多的牽引力,不再使用。文章指出:

的問題如下:

考慮下面的類定義:

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

你有一個類,TFoo,從一類下降,TSuperFoo和 它有兩個數據成員,這兩個數據成員都是指向 類TBar的對象的指針。在本練習中,考慮指針 擁有擁有語義,TBar單形類。爲此課程編寫 賦值運算符。

尋找在不同字典中的定義,根「的Morphic」最常被定義爲「具有特定的形式或形狀」,後面一些跡象表明,它通常與一些前綴使用如聚(多晶型)或同(同態)。

前綴「mono」通常被定義爲「single」或「one」或「lone」,通常與諸如「plane」(單翼或單翼飛機)或「rail」(單軌或單軌或軌道)。在這種情況下,似乎是一個問題,「單形」(單形)被用作「多態」(許多形成)的對立面。單形類是一個類,它不被用作任何其他類的基類,也不是從另一個類派生的類。

一個單形類的更嚴格的定義是該類還必須只使用單形類或內置數據類型。單形類不能包含任何多態類作爲其定義或行爲的一部分。

這的確提出了一個嚴格的單形類是否可以包含模板化變量或方法的問題。我的第一個直覺是,只要模板創建一個單形類,那就很好。換句話說,如果編譯器正在爲你寫一個單形類,它就好像Sally在行中的隔間寫下它一樣。

所以也許嚴格的定義應該排除運行時多態性?

因此,它似乎是由單態類的第一,不太嚴格的定義問題的類Foo是單態的,因爲它沒有從任何其他類派生也不具有virtual析構函數,暗示不打算用於派生另一個類,也沒有任何方法。

然而,它在print()方法中確實使用std::cout,而std::cout肯定是多態的。所以也許更準確地宣稱這是一個半單形類,因爲它使用了一個多態類?

它似乎是一個單形類獨立。然而,我們如何編寫一個類以使其獨立,並且編譯器將標記從該類派生另一個類的任何嘗試。

通過從現有類派生一個新類,C++允許一個類成爲其他類的超類。關於什麼是可能的,有多少有時是非常複雜的規則,多態如何成功地工作,但是最終使用關鍵字(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

謝謝你的時間和答案,理查德。很有意思! – Edward83