如何解决隐式定义的用户转换运算符支持的操作
我目前正在学习隐式定义的转换运算符(也称为用户定义的转换)如何为给定类工作。在我的特殊情况下,我想测试我的类以隐式转换为默认的整数类型。下面是我的代码段。
import scrapy
class GlassSpider(scrapy.Spider):
name = 'glasses1'
allowed_domains = ['www.glassesshop.com']
start_urls = ['https://www.glassesshop.com/bestsellers']
def parse(self,response):
glasses = response.xpath("//div[@id = 'product-lists']")
for glass in glasses:
yield{
'name': glass.xpath(".//div[@class='p_title']/a/text()").get(),'url': glass.xpath(".//div[@class='product-img-outer']/a/@href").get(),'img_url': glass.xpath(".//img[@class='lazy d-block w-100 product-img-default']/@src").get(),'price': glass.xpath(".//div[@class='p-price']//span/text()").get()
}
other option
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider,Rule
class BestMoviesSpider(CrawlSpider):
name = 'best_movies'
allowed_domains = ['imdb.com']
#start_urls = ['https://www.imdb.com/chart/top/?ref_=nv_mv_250']
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/76.0.3809.100 Safari/537.36'
def start_requests(self):
yield scrapy.Request(url='https://www.imdb.com/search/title/?groups=top_250&sort=user_rating',headers={
'User-Agent': self.user_agent
})
rules = (
Rule(LinkExtractor(restrict_xpaths="//h3[@class='lister-item-header']/a"),callback='parse_item',follow=True,process_request='set_user_agent'),Rule(LinkExtractor(restrict_xpaths="(//a[@class='lister-page-next next-page'])[2]"),process_request='set_user_agent')
)
def set_user_agent(self,request):
request.headers['User-Agent'] = self.user_agent
return request
def parse_item(self,response):
yield {
'title': response.xpath("//div[@class='title_wrapper']/h1/text()").get(),'year': response.xpath("//span[@id='titleYear']/a/text()").get(),'rating': response.xpath("//span[@itemprop='ratingValue']/text()").get(),'genre': response.xpath("//div[@class='subtext']/a[1]/text()").get(),'duration': response.xpath("normalize-space((//time)[1]/text())").get(),'movie_url': response.url,'user-agent': response.request.headers['User-Agent']
}
如您所见,这些运算符没有提供错误,但是#include <iostream>
using std::cout;
using std::cin;
using std::endl;
class A {
public:
A(int);
operator int() const;
protected:
int value;
};
A::A(int input) : value(input) {
}
A::operator int() const {
return this->value;
}
int main() {
A foo = 1;
foo = foo + 1; // no error
foo = foo * 1; // no error
foo = foo / 1; // no error
cout << foo << endl; // no error
!foo; // no error
&foo; // no error
foo%1; // no error
foo != 1; // no error
foo == 1; // no error
foo >= 1; // no error
foo <= 1; // no error
foo < 1; // no error
foo > 1; // no error
foo && 1; // no error
foo || 1; // no error
A *boo = &foo; // no error
*boo = 5; // no error
cin >> foo; // error
foo *= 2; // error
foo++; // error
return 0;
}
,>>
和*=
会产生错误;也就是说,对于这些运算符,不会隐式转换A类的对象。我注意到它没有为类似的赋值运算符转换。有人可以解释为什么会这样吗,以及隐式用户转换支持的运算符是什么?
解决方法
这些运算符:
cin >> foo; // >> endl is a bug
foo *= 2;
foo++;
只能在l值上调用。您的转换运算符返回一个临时int
,它不是l值。另外,您的操作员具有const
的资格,这意味着只能在const A
实例上调用它。
您需要提供一个转换运算符,该运算符返回如下所示的l值:
class A {
public:
operator int&();
// ...
};
A::operator int&() {
return this->value;
}
请注意,如果您希望它返回一个可修改的l值,则不能为const
。
这里是demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。