我熟悉创建类并使用点符号来访问对象的函数。我不熟悉使用指针做同样的记法。请查看我的代码并建议我如何更改类定义中的代码, not main。
主:
Pet * p = new Pet( "Sunset", "Cat", "meow..." );
cout << "The " << p->getVariety( ) << " " << p->getName( ) << " speaks by saying " << p->spea( ) << endl;
课程:
class Pet
{
public:
Pet( );
Pet( std::string name, std::string variety, std::string says )
{
using namespace std;
myName = name;
myVariety = variety;
howIspeak = says;
}
std::string getName( ) const
{
return myName;
};
std::string getVariety( ) const
{
return myVariety;
};
virtual void speak( );
protected:
std::string myName;
std::string myVariety;
std::string howIspeak;
};
答案 0 :(得分:1)
我想,这是
virtual void speak( );
in
cout << "The " << "..." << p->speak( ) << endl;
导致错误消息。您无法将void
值输出到std::ostream
。
据推测,应该是
virtual std::string speak();
答案 1 :(得分:1)
请查看我的代码并建议我如何更改类定义中的代码,而不是main。
using namespace std;
在那里没用,只需删除即可。
然后,您拥有virtual
个方法和protected
个成员,这表明您愿意从该类继承:要么不要也要定义virtual
析构函数。
此外,您从主要调用的speak
成员函数返回void
,这不是您要传递给operator<<
std::cout
的类型。< / p>
最后:你为什么要使用 nake指针和动态分配?除非你绝对被迫,否则不要使用它,即使这样,也要使用std::shared_ptr
或std::unique_ptr
(或任何其他智能指针系列):
std::unique_ptr<Pet> ptr(new Pet( "Sunset", "Cat", "meow..." ));
在该行之后,ptr
的行为几乎与任何其他指针一样,除非它完成后将自行清理(将调用delete
)(当它离开范围时)。 / p>
答案 2 :(得分:0)
我建议阅读Lippmann等人的C ++入门书“C ++ Primer(第4版)”。或者找到关于C ++的在线教程。您要解决的问题需要比SO Q和A中的相关理解更多。