gpt4 book ai didi

c++ - 从重载运算符返回对象>>

转载 作者:行者123 更新时间:2023-11-28 04:56:09 29 4
gpt4 key购买 nike

C++ 不是我的第一语言选择。而且我不知道我的想法是否完全错误。

到目前为止我已经创建了什么。

我有一个带有属性的类。指向类 Shape 的指针。我已将类命名为 ShapePtr。

ShapePtr.h

class ShapePtr{
public:

ShapePtr():sPtr(0){};
ShapePtr(Shape *s):sPtr(s){};
ShapePtr(const ShapePtr *s){
if( s->sPtr != 0 )
sPtr = s->sPtr->clone();
else
sPtr = 0;
};

friend std::istream& operator>>(std::istream& is, const ShapePt &s);

Shape *sPtr; //Points on Shape or 0

};

ShapePtr.cpp

std::istream& operator>>(std::istream& is, const ShapePtr &s){

std::size_t found;
std::string row, theShape;

while(!is.eof()){

getline(is,row);
found = row.find(":");
theShape= row.substr(0,found);

if(theShape.compare("CIRKEL") == 0)
{

ShapePtr tempSPtr = ShapePtr(new Circle);
/*return*/ ShapePtr test = ShapePtr(tempSPtr.sPtr -> creat(row));

}else if(theShape.compare("POLYGON") == 0){
/*...*/
}else if(theShape.compare("RECTANGLE") == 0){
/*...*/
}else if(theShape.compare("POINT") == 0){
/*...*/
}
/*else if ...*/

};

Shape 类是一个带有虚函数 creat() 的抽象基类。

形状.h

class Shape{
public:
virtual Shape* creat(std::string row) = 0;
};

圆是许多具有不同形状的子类之一。

圆.h

class Circle : public Shape{
public:
Circle();
Circle( double x, double y, double r) : Shape(x, y), radie(r){};

Shape *creat(std::string row);

private:
double radie;
};

圆.cpp

Circle::Circle()
: Shape(0, 0), radie(0)
{};

Shape * Circle::creat(std::string row){

std::size_t found1, found2;
std::string xstr, ystr, rstr;
double xd, yd, rd;

found1 = row.find("(");
found2 = row.find(",");

//X position
xstr = row.substr(found1 + 1,found2 - found1 -1);

found1 = row.find(",");
found2 = row.find(")");

//Y position
ystr = row.substr(found1 +1,found2 -found1 -1);

found1 = row.find_last_of(":");

//Radie
rstr = row.substr(found1 + 1);

//To double
xd = atof(xstr.c_str());
yd = atof(ystr.c_str());
rd = atof(rstr.c_str());

return new Circle(xd, yd, rd);
};

我的问题是我希望能够使用 ShapePtr 重写运算符读取 main 中的文件>>。然后我想重新调整在 ShapePtr 函数中创建的对象。在我上面的代码中,该对象称为 test。我在同一行上写了一条评论/return/来澄清。在 main 中,这个对象将被添加到一个列表中。

我无法更改 operator>> 以返回 ShapePtr 而不是 istream,因为那样它就不再被覆盖。

主体应该是这样的

int main(){

ifstream is("fil.dat");
istream_iterator<ShapePtr> shapein(is), endofshapein;
list<ShapePtr> shapelist(shapein, endofshapein );
}

fil.dat 的外观示例

POLYGON: { (0,0) (10,0) (5,2) (5,5) }
CIRKEL: (5,5) Radie:4
RECTANGLE: (4,10) Hight:4 Width:2
POINT: (6,7) :1

澄清我的问题。阅读和创建形状不是问题。它们是在 ShapePtr 中创建和打印的。问题是如何将它们放到 main 中的列表中。可以做到吗,还是我创建了很多从一开始就很糟糕的代码?

我显然没有在论坛上写下我所有的代码,而且我可能写得太多了。但我宁愿写得太多也不愿写得太少。

预先感谢您的回复。

最佳答案

您不是惯用地覆盖 std::istream& operator>>,所以 std::istream_iterator 不会做正确的事情。

正确的签名是std::istream& operator>>(std::istream& is, ShapePtr &s)。一旦你有了它,你就可以分配给 s 并且 return is;

std::istream& operator>>(std::istream& is, ShapePtr &s){
std::string row;

if(getline(is,row)) {
std::size_t found = row.find(":");
std::string theShape = row.substr(0, found);

if(theShape.compare("CIRKEL") == 0){
Circle c;
s = c.create(row);
return is;
} else if(theShape.compare("POLYGON") == 0){
/*...*/
} else if(theShape.compare("RECTANGLE") == 0){
/*...*/
} else if(theShape.compare("POINT") == 0){
/*...*/
} /*else if ...*/
}
return is;
}

然而,您的设计存在大量其他问题,例如 Circle::create 是返回 new Circle 的成员函数而不是构造函数,泄漏Shapes 因为您使用原始指针并且不注意删除的东西等。

关于c++ - 从重载运算符返回对象>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47092588/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com