2014-11-22 62 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