什么非标产品?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么非标产品?相关的知识,希望对你有一定的参考价值。
参考技术A非标的意思是:非标准的,没有国家标准和行业标准可以依据的。
拓展资料:
非标产品指不是按照国家颁布的统一的行业标准和规格制造的产品或设备,而是根据自己的用途需要,自行设计制造的产品或设备。且外观或性能不在国家设备产品目录内。
为了满足大工业生产的需要,将已生产的,经使用证明性能良好的机械设备进行定型,并且系列化,称为标准产品。而根据用户要求,在标准产品的基础上,生产、改造或定做的产品称为非标产品。
标准化、系列化的产品主要适用于通用的机械设备,实际在设计一个新的工业装置时,有部分设备是专用的,无法在已有系列化的单子中找到,需要进行单独的设计制造的,而且将来的通用性也不会高,这类设备称谓非标产品。
参考资料:非标产品_百度百科
请求的非标量类型
【中文标题】请求的非标量类型【英文标题】:non-scalar type requested 【发布时间】:2010-06-15 15:10:06 【问题描述】:有人可以帮我解决一个错误
conversion from `A' to non-scalar type `B' requested
我有 A 类并从 B 派生,但这些行有问题:
A a(1);
A *pb = new B(a);
B b = *pb; //here I have an error
提前感谢您的帮助
class A
protected:
int player;
public:
A(int initPlayer = 0);
A(const A&);
A& operator=(const A&);
virtual ~A();
virtual void foo();
void foo() const;
operator int();
;
class B: public A
public:
B(int initPlayer): A(initPlayer);
~B();
virtual void foo();
;
已编辑
我有这段代码并且(我无法更改):
A a(1);
A *pb = new B(a);
B b = *pb;
我尝试为 B 创建构造函数:
B::B(const A & a):
player(a.player)
B& B::operator=(const A& a)
if(this == &a)
return *this;
player = a.player;
return *this;
但它给了我一个错误,真的需要专业人士的帮助
【问题讨论】:
【参考方案1】:您的问题是由于静态类型检查造成的。当你有这条线时:
A *pb = new B(a);
pb
的静态类型为A *
,动态类型为B *
。当动态类型正确时,编译器正在检查静态类型。
对于这个简单的代码,由于您知道 pb
的动态类型始终为 B,因此您可以使用静态强制转换来解决此问题:
B b = *static_cast<B *>(pb);
但请注意,如果 pb
的动态类型是 A *
,则强制转换会导致未定义的行为。
【讨论】:
我是否有另一种方法来解决这个问题,而无需强制转换?这将非常有帮助 @lego69 - 一种常见的技术是创建一个虚拟的clone
方法并让每个类都覆盖它。除此之外,我无法在不知道为什么你试图复制你的对象的情况下回答。【参考方案2】:
当您取消引用“A”指针时,即使它指向“B”,也会得到“A”。多态在这里没有发挥作用!要将“B”属性保留到“A”对象,您应该按照其他一些答案中的说明正确转换初始化。
【讨论】:
这里需要的不是赋值运算符,而是复制构造函数。 你能给我举个例子吗,我是初学者,我明白你说的,但是写起来有点难 @lego69:请忽略我之前的建议。对于这个特定的例子来说,它太专业了,一般来说不正确。如果您使用复制构造函数或赋值运算符使用“A”来创建/分配“B”,它将丢失“A”指针表示的派生对象的“B”属性。【参考方案3】:在这种情况下,动态转换是最合适的。动态转换将调用运行时类型系统来确定 bp 的“真实”类型,如果无法转换为请求的类型,将返回 0
。如您所知,您也可以在此处使用static_cast
,但在这种情况下通常不是这种情况。
B* b = dynamic_cast<B*>(pb);
【讨论】:
【参考方案4】:*pb
会给你一个A&
而不是B&
。就像pb
是A*
而不是B*
,即使实际对象是B
。
B b = *pb
将尝试使用合成的复制构造函数复制构造 B
。因此,复制构造函数将寻找B&
作为其参数。您没有构造函数可以从 A
生成 B
,因此会出现错误。
正如@R Samuel Klatchko 所说,你可以直接施放它,或者在你给出的情况下,你可以让pb
实际上是B*
。
【讨论】:
你能给我一个例子,如何为B创建复制构造函数,我创建了它,但是我收到一个错误 @lego69:我怀疑这就是你想要的,它只是你的编译器错误的根源。您正在尝试对原始B
对象进行完整克隆,是吗?我之前打算更新我的答案以建议clone
方法,但@R Samuel Klatchko 已经建议了。这可能是你想要的假设你真的想要一个对象的副本并且指向原始对象的引用或指针不会这样做。在不知道b
将如何使用的情况下很难说。【参考方案5】:
您正在尝试将 A 类型的对象分配给 B 类型的对象。除非您定义类型转换运算符,否则这是不允许的。 pb
是指向 A 对象的指针,通常它不是指向 B 的指针(在您的情况下,它是,但对于编译器来说并不重要,因为它被声明为指向 A 的指针)。为了使这样的分配成为可能,您首先需要将 pb
向下转换为 B 的指针(正如 R Samuel Klatchko 指出的那样,在您的情况下 static_cast
非常好;在其他情况下,您可能需要使用dynamic_cast
)。
【讨论】:
以上是关于什么非标产品?的主要内容,如果未能解决你的问题,请参考以下文章