我正在嘗試用C 制作一個雙鏈表,而且我想把它做對。因此,我認為我應該遵守任何 "官方 "C 準則所推薦的介面結構,比如說介面。在 Java 中,有這樣的介面,人們可以自由地使用,并對抽象資料型別進行某種程度的標準化(例如 https://docs.oracle.com/javase/8/docs/api/java/util/List.html)。
我的問題。C 中是否有類似的東西?Startpageing給我找到了這個鏈接:
https://en.cppreference.com/w/cpp/container/list
但它似乎沒有使用任何繼承。
uj5u.com熱心網友回復:
標準庫的設計方式首先是為了避免需要這樣的繼承。
更多的時候,我們需要的是 "繼承"。
更多的時候,你可以通過在容器型別上使用鴨嘴型來獲得與介面基本相同的行為,而沒有任何間接呼叫的運行時開銷:
#include <vector>
#include <list>
#include <iostream>
template<typename Collection>
void do_something(const Collection& data) {
for(const auto& v : data) {
std::cout << v << "
"。
}
}
int main() {
std::vector<int> a;
std::list<int> b。
do_something(a)。
do_something(b);
如果你從Java的角度來看待這個問題,你可以把它看作是 "類固醇的泛型",即一個函式可以泛型地接受任何看起來像一個集合的東西。
還有一些涉及迭代器和范圍的其他方法,但其原理是相同的。
uj5u.com熱心網友回復:
在C 中是否有這樣的東西?
在C 中是否有這樣的東西?
這取決于你所尋找的相似程度以及你所尋找的位置。
Java 的集合介面是基于運行時多型性的。用C 的話來說,這樣的API是基于繼承和虛擬成員函式的。
Java的集合介面是基于運行時多型的。
標準庫所提供的容器與 Java 中的集合具有類似的功能。然而,它們不提供基于繼承和虛擬成員函式的 API。相反,它們的API是基于編譯時的多型性,即模板,這有點類似于Java中的泛型。在Java集合和C 標準容器的類比中,標準中規定的概念又稱命名要求類似于Java中的介面。
可以在 C 中實作介面(如 Java 中的介面)。C 的對應物僅僅是沒有非純成員函式的抽象類。您必須使用虛擬繼承,以便以您在 Java 中可以共享介面的方式共享基礎。也可以在運行時多型性的基礎上實作一個容器API。但是這樣的容器API并不是由標準庫提供的。
我正在嘗試用C 制作一個雙鏈表
除了出于練習的目的,你很少需要這樣做,因為標準庫中已經有了雙鏈表的實作。這就是你在問題中所鏈接的std::list的參考頁。
而且我正在努力把它做對。
"正確 "是相對的,但是你可以通過復制標準庫的內容來完成。
如果你確實希望遵循標準庫所展示的范例,那么你應該提供一個基于概念(又稱命名需求)和模板的 API。您的類(模板)應符合Container概念,更具體地說,是SequenceContainer概念。
uj5u.com熱心網友回復:
當然,哪種型別的語言會不實作集合? 然而,撰寫你自己的集合類是很費力的。
你可以#include<vector.h>,然后使用(舉例):
vector <int> c { 1, 2, 3 };
c.push_back(4)。
cout << c[2] 。
uj5u.com熱心網友回復:
在C 中,你可以把它作為你自己的介面來實作(記住在實際實作之前添加public)。
為了做得更好,你可以在你自己的抽象類中定義你自己的抽象方法,就像:
class ExampleAbstractClass {
public:
virtual string myFunction() = "待實施"。
void notAbstractMethod(int aNumber) {
aNumber = h;
}
protected:
int aNumber;
};
class ExapleClass: public ExampleAbstractClass{
//抽象的實作。
public:
string myFunction() /span> {
return "這就是現在的自定義實作!"。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/320060.html
標籤:
上一篇:為什么我不能在純C語言中包含AppKit,即使我可以自己宣告函式?
下一篇:具有多重繼承性的單子
