2014-11-22 99 views
0

因此,我有一個抽象類Product,其中包含字段名稱和價格。有跡象表明,從產品繼承了幾類,產品是抽象的原因是因爲這些子類必須實現這個功能(在產品定義):抽象類的C++輸出運算符

virtual std::string getCategory()=0; 

類別是不是一個領域,它只是取決於它的子類我們有,並在某些情況下的價格。

現在,我要爲產品子類的輸出操作,但因爲我只是想打印的名稱和價格,我在Product.h這樣做:

friend std::ostream& operator<<(std::ostream& os, const Product& secondOperand); 

而這Product.cpp:

ostream& operator<<(ostream& outputStream, Product& secondOperand){ 
    outputStream << "["<<secondOperand.getName()<<" "<<secondOperand.getPrice()<<"]"<<endl; 
    return outputStream; 
} 

現在我得到這個錯誤在Visual Studio:

Error C2259: 'Product' : cannot instantiate abstract class 

我不想實現THI每個子類的輸出(因爲我必須從字面上複製一切不理想的東西)。此外,我開始與產品不是純粹的虛擬,但然後我有鏈接器錯誤的getCategory()函數...

+0

[C++抽象類操作符重載和接口強制問題]的可能重複(http://stackoverflow.com/questions/2059058/c-abstract-class-operator-overloading-and-interface-enforcement-question) – David 2014-11-22 13:34:42

+1

*你在哪裏得到錯誤?它是完整的錯誤輸出嗎? – 2014-11-22 13:35:46

+2

您正在顯示'const Product&'用於聲明,而'Product'用於執行。這種不匹配可能無法編譯。但是,此外,它讓我懷疑你在其他地方有一個錯誤,因爲你正在按值傳遞'Product',從而使編譯器認爲你想實例化一個,從而導致編譯錯誤。 – TheUndeadFish 2014-11-22 13:40:27

回答

0

沒有錯的方法,這裏是一個示例編譯和運行....

#include <string> 
#include <iostream> 

using namespace std; 

class Product 
{ 
public: 
    friend std::ostream& operator<<(std::ostream& os, const Product& secondOperand); 
    virtual ~Product() = 0; 

    string getName() { return "Product Name"; } 
    string getPrice() {return "£1.00"; } 
    virtual std::string getCategory()=0; 
}; 

ostream& operator<<(ostream& outputStream, Product& secondOperand){ 
    outputStream << "["<<secondOperand.getName()<<" "<<secondOperand.getPrice()<<"]"<<endl; 
    return outputStream; 
} 

Product::~Product() {} 

class DerivedProduct : public Product 
{ 
public: 
    DerivedProduct() {} 
    std::string getCategory() { return "Derived getCategory()"; } 
}; 

int main(int argc, char *argv[]) 
{ 
    DerivedProduct d; 
    cout << d.getCategory() << endl; 
    cout << d << endl; 
    return 0; 
} 
+0

謝謝,這有助於我理解我只是看着錯誤的部分!我的錯誤似乎通過包括解決,因爲可能聽起來很愚蠢...... – harrymuana 2014-11-22 14:52:55