gpt4 book ai didi

c++ - 使用重载赋值运算符

转载 作者:行者123 更新时间:2023-11-28 00:25:52 25 4
gpt4 key购买 nike

我有一个 template<> class A使用非默认构造函数和重载赋值运算符:

template<typename T>
class A
{
public:
A(T x);
A(A<T> &parent);
A<T> & operator=(A<T> &rhs);
};

还有一个 class B , 其中有 A作为成员,它有自己的重载赋值运算符和 A 的 getter 方法

class B
{
public:
B();
B& operator=(B &rhs);
A<int> get_A();

protected:
A<int> *member;
};

我已经定义了赋值运算符和A getter方法如下:

B& B::operator=(B &rhs)
{
*member = rhs.get_A();
return *this;
}

A<int> B::get_A()
{
return *member;
}

赋值运算符在这种情况下不起作用。我在这里错过了什么吗?我收到以下错误:

B.cpp(92): error: no operator "=" matches these operands
operand types are: A<int> = A<int>

我也试过

B& B::operator=(B &rhs)
{
A<int> temp(rhs.get_A());
*member = temp;
return *this;
}

在这种情况下我得到:

B.cpp(92): error: no instance of constructor "A<T>::A [with T=int]" matches the argument list
argument types are: (A<int>)
A<int> temp(rhs.get_A());

最佳答案

1

关于

A<T> & operator=(A<T> &rhs);

最好是这样

A<T>& operator=(A<T> const& rhs);


2

关于

B& B::operator=(B &rhs)
{
*member = B.get_A();
return *this;
}

最好是这样

B& B::operator=(B const& rhs)
{
*member = rhs.get_A();
return *this;
}


3

关于

  B() : member(4);

那不应该编译。

很难说它应该是什么,因为 member 被声明为一个指针,而提供的值是一个不兼容的整数。


4

关于

A<int> get_A();

最好是这样

A<int> get_A() const;

以便它可以在 const 对象上调用。


5

关于 comment

A is a bit more complicated and contains a linked list. The linked list has to be updated every time an object of A is copied

每次复制对象时都必须对其进行更新,这听起来确实有点可疑。旧的 std::auto_ptr 类几乎就是这样,它通过涉及特殊代理引用类的 hack 实现了效果。 可能您的对象不是真正可复制的,而只是可移动的,在这种情况下,无论实际操作是什么,都不要使用复制赋值运算符,而是使用例如一个普通的命名成员函数。

关于c++ - 使用重载赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125116/

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