【发布时间】:2025-11-26 17:55:02
【问题描述】:
我有一个问题......好吧,我不确定。我真的不知道这意味着什么。我使用了下图所示的相同范例,我在类中创建了一个对象,并为该对象提供了对该类的引用。此设计用作事件处理程序。
我添加了一段非常不相关的代码,我在其中循环遍历对象映射并重新分配它们。由于使用了= 运算符,它引发了一个问题。但我仍然不知道它在抱怨什么。
// Example program
#include <iostream>
#include <string>
#include <map>
class A {
public:
class Handler {
public:
Handler(A &a):a(a){}
virtual void HandleIt(){
a.DoThings();
}
A &a;
};
A():my_handler(*this){}
Handler my_handler;
void DoThings(){
std::cout << "Im doing things";
}
};
std::map<std::string, A> my_map;
void ReplaceInMap(A &a){
std::map<std::string, A>::iterator it;
for(it = my_map.begin(); it != my_map.end(); ++it){
it->second = a;
}
}
int main()
{
A a;
A b;
A c;
my_map.insert(std::make_pair<std::string, A>("A!", a));
my_map.insert(std::make_pair<std::string, A>("B!", b));
my_map.insert(std::make_pair<std::string, A>("C!", c));
ReplaceInMap(a);
}
C++ 98
In member function 'A::Handler& A::Handler::operator=(const A::Handler&)':
8:15: error: non-static reference member 'A&A::Handler::a', can't use default assignment operator
In member function 'A& A::operator=(const A&)': 6:7:
note: synthesized method 'A::Handler& A::Handler::operator=(const A::Handler&)' first required here
In function 'void ReplaceInMap(A&)': 29:20: note: synthesized method 'A& A::operator=(const A&)' first required here
这个错误是什么意思?有什么问题?
【问题讨论】:
-
问题出在错误中——你试图复制你的类,但是隐式复制赋值运算符被删除了,因为 Handler 也有一个删除的复制赋值,并且 那个 i> 发生是因为它有一个
A&作为成员。您必须为这两个类定义自己的复制 ctor 和分配。 -
@d4rk4ng31 我看不出那里的
a(a)有什么问题...似乎这正是预期的结果-初始化成员引用:思考:编辑:我现在看到你了正在谈论复制 ctor,但代码中没有定义复制 ctor,所以,不知道您的意思是什么 -
@d4rk4ng31 第一个“a”是成员,第二个是参数。也就是说,没有阴影。 (不过,它不是复制构造函数。)
-
@molbdnilo 好吧,在初始化程序的情况下存在阴影。 mem-initializer-id 中没有阴影。
标签: c++