我有以下代码:
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
我想要的是+ =运算符应该将B对象(运算符的右侧)添加到A对象的元素成员中。 所以,让我们将main修改为:
class B{
/*
...
*/
};
class A{
B** elements;
public:
A operator+=(const B& b){
// this->elements[0] = &b;
}
A(int number){
this->elements = new B*[number];
}
/*
...
*/
};
int main(){
A a(10);
return 0;
}
此后a.elements [0]应该是b对象。 我评论了一条不起作用的行,但显示了我想要的内容。取消注释它会产生以下错误:从const B *到B *的无效转换
真正的代码当然要长得多,如果你告诉我如何让+ =运算符总是将B对象分配给A.elements [0]就足够了,那么我可以根据需要编辑我的代码
由于
答案 0 :(得分:3)
关注您的问题,B*
不是B const*
:首先,您可以调用非const
的方法,而后者则不然。< / p>
并且编译器抱怨这个:你声明了一个指向可修改B
的指针数组,但是你尝试在其中存储指向不可修改的B
的指针。因此,如果您只是想解决此问题,您可以决定例如存储不可修改的B:
B const** elements;
public:
A& operator+=(const B& b) {
this->elements[0] = &b;
return *this;
}
A(int number) {
this->elements = new B const*[number];
}
但您的代码中存在严重问题:
const B&
的地址,但这个B来自哪里?它可能具有自动存储功能,并在未来的某个地方成为无效指针B
对象的指针,因此负责释放它。这是C ++,你有std::unique_ptr
,std::shared_ptr
,std::vector
,只是尝试做你在C中做的事情,甚至没有尝试使它们安全无法没有任何意义。
答案 1 :(得分:0)
您的设计存在严重问题。
A operator+=(const B& b){
// this->elements[0] = &b;
这里的想法是将b插入到您的集合中,但您的集合只不过是指向一些(未知长度)原始内存量的指针。您无法知道元素[x]是否存在以便存储&amp; b。就此而言,您根本不知道元素是否存在。您需要更多的簿记来存储长度。
但更糟糕的是,您传递对const B的引用并获取其地址,将该指针存储在您的集合中。如果参数是绑定到临时的引用怎么办? (Rvalues 可以绑定到const左值引用)。在这种情况下,当您将指针插入集合时,它指向的对象就会被销毁。
这假设你解决了const-wrongness,因为你引用了一个const b,取其地址,并希望它指向一个非const B.它没有。如果b真的指向一个实际的const对象(并且通过指针使用b的非const接口),那么将它抛出会导致未定义的行为。
你的成长函数会泄漏内存并丢失旧元素。是的,它是伪代码,但距离任何真实到基础的想法都太远了。
只有几行就有很多非常危险的想法。以下是建议: