2015-08-23 32 views
2

最近我對學習D編程語言感興趣。 (具體來說D2,在撰寫本文時是人們所指的,因爲D原來爲了與現有代碼兼容而處於維護模式)。有沒有什麼C++可以比D做得更好,或者D不能做到? (多繼承的例子)

在決定是否使用C++或D(我已經知道C++,我對D一無所知),我想知道C++比D好嗎?如果你在線閱讀D,有很多材料只是說「這裏是一個C++代碼的例子,這裏是D代碼的一個例子 - 看起來好多了」。對於所示的例子當然是如此。

一些差異可能會受到意見。例如,從派生類中調用基類構造函數是由super()(D)而不是<class name>(args)在初始化列表中(在:表示法之後)(C++)完成的。我個人不喜歡這個super但這只是我的意見,這是不是我問的問題。

更相關的是D不能支持多重繼承。 (!)

  • D NOT不支持哪些C++?
  • 是否有事情的例子C爲了某些語法或邏輯原因在D中做得更好? (不主要是基於意見的,但如果它是相關的和建設性的,則可隨意以基於觀點的論點作出迴應。)
  • D不支持多重繼承的事實會導致您被「鎖定」你可以用C++做些什麼? (我想也許iostream/ifstream/ofstream操作?)
  • 如果你真的需要它,有多種繼承禁令的方法嗎?

例如,有一件事你可能想在C++做的是類似如下:

class base 
{ 

} 

class base_has_read_operation 
{ 
    public: 
    void read() 
    { 
     // complicated read function, 100000 lines of code... 
    } 

    virtual void do_read() = 0; 

    private; 
    // data 
} 

class base_has_write_operation 
{ 
    public: 
    void write() 
    { 
     // complicated write function, 100000 lines of code 
    } 

    virtual void do_write() = 0; 

    private: 
    // data 
} 

class reader : public base_has_read_operation 
{ 
    public: 
    void do_read() 
    { 
     read(); 
    } 
} 

class writer : public base_has_write_operation 
{ 
    public: 
    void do_write() 
    { 
     write(); 
    } 
} 

class read_writer : public base_has_read_operation, base_has_write_operation 
{ 
    public: 
    void do_read() 
    { 
     read(); 
    } 

    void do_write() 
    { 
     write(); 
    } 
} 

但大概沒有多重繼承,你不能這樣做呢?

+0

這很有趣,但它似乎對這個網站太開放了。 – Potatoswatter

+3

請參閱這裏:http://programmers.stackexchange.com/questions/97207/what-does-c-do-better-than-d –

+0

歡迎來到圖靈焦油坑,一切都是相同的,但沒有任何興趣是很容易的。你可以在C++中實現D,反之亦然:其他任何都不能做任何事情。 – Yakk

回答

4

您的多繼承問題可以使用模板mixin來解決,也就是說,可以使用一個模板混入另一個代碼中。例如:

interface IWriter { 
    void do_write(); 
} 

// It is a template, you can specify compile-time arguments 
mixin template Write() { 
    // complicated write function 
} 

interface IReader { 
    void do_read(); 
} 

mixin template Read() { 
    // complicated read function 
} 

// D has multiple interface inheritance 
class ReaderWriter : IWriter, IReader { 
    void do_write { 
         // You can do other things before... 
     mixin Write; // The code of Write is inserted here 
         // ...or after 
    } 

    void do_read { 
     mixin Read; 
    } 
} 

我可以說,雖然你肯定會更好過,如果你的讀寫器有一個手柄,讀者和作家,而不是依靠過耦合多重繼承。

1

兩個月前我已經從C++轉到D了,所以也許我錯了。 ref限定符不會替換C++中的引用。特別是對於C++ 11右值引用和轉發,你可以做很多高效的工作,例如只需要複製一個參數。 D我遇到的問題之一是參考和價值類型。 C++對此非常透明。 這使得編寫高效代碼變得困難。假設你有一些類C!(T)。您可能想要創建一個T,但如果T是一個類,則需要T t = new T(arg)否則T t = T(arg)。我已經使用了mixin,並且使用了T t = mixin((is (T == class) ? "new " : "") ~ "T(arg)");。這相當醜陋。在這種情況下,我更喜歡C++值對象。

+0

我認爲有時候分配一個新對象的泛型代碼實際上是一個錯誤無論如何,因爲它有一個潛在的隱藏成本......但無論如何,你可以用'auto t = new T(arg);'得到類似的行爲,它適用於所有類型(包括,我認爲,像int這樣的內置函數)。這將始終產生一個參考類型。 –

+0

現在我不得不處理指針;這完全是*不是我想要的東西。我總是希望取決於「T」的相同類型,最好是「T」本身。 不能以另一種方式完成嗎? – Bolpat

相關問題