C++默认复制构造函数不可行
C++ Default Copy Constructor Not Viable
我有2个类,User
和BBoard
(公告板(。
我在BBoard
中有一个成员函数,它检查从文件中读取数据并将其推送回向量userList
。我还有一个成员函数,用于检查User
是否存在(如果User
存在,我想使用默认的复制构造函数并将其分配给currentUser
(
这些是我在 BBoard 中的私有变量:
// private:
// std::string title;
// std::vector<User> userList;
// User currentUser;
// std::vector<Message> messageList;
这是BBoard
中推回User
s 的成员函数:
while (inFS >> dataName && inFS >> dataPass) {
User x(dataName, dataPass);
userList.push_back(x);
}
这是BBoard
中的成员函数,用于检查User
是否存在并尝试使用默认复制构造函数将其分配给currentUser
。
bool BBoard::userExists(const string& uName, const string& uPass) const {
for (int i = 0; i < userList.size(); ++i) {
if (userList.at(i).getUsername() == uName) {
if (userList.at(i).check(uName, uPass)) {
currentUser = userList.at(i); //<-- HERE
return true;
}
}
}
return false;
}
我得到的错误是这样的:
BBoard.cpp:153:21: error: no viable overloaded '='
currentUser = userList.at(i);
~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~
./User.h:8:7: note: candidate function (the implicit copy assignment operator) not viable:
'this' argument has type 'const User', but method is not marked const
class User {
我没有在User
中声明复制构造函数,所以我希望隐式创建的构造函数可以工作。我也没有推回const User
。
根据 https://en.cppreference.com/w/cpp/language/copy_constructor 隐式复制构造函数具有以下形式:T::T(const T&)
所以我不确定我哪里出错了。
我可以提供程序的任何其他部分。
这与任何复制构造函数无关。
bool BBoard::userExists(const string& uName, const string& uPass) const
这将定义一个const
类方法。这就是声明末尾的尾随const
关键字的含义。const
类方法不能修改其类的任何成员,它们都有效地const
到该方法(除非显式声明mutable
,这里不是这种情况(。
currentUser = userList.at(i);
这将尝试修改类的成员。由于它实际上是const
类成员,因此无法对其进行修改。
相关文章:
- C++:考虑但不调用构造函数的特殊性
- 不命名构造函数和析构函数上的类型错误
- 为什么不递增?(构造函数)
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- TypeError: [c++ addon class] 不是构造函数
- 应用于运算符而不是构造函数的显式关键字
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 为什么在传递给函数而不是构造函数时调用析构函数?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 运行 std::线程不在构造函数中
- 如果在C++中不需要构造函数或析构函数,是否有必要显式声明它?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 在转换中使用函子(带/不带构造函数)
- 将构造对象但不是构造函数的方法
- 使用 -pedantic 编译时采用 std::reference_wrapper 的不明确构造函数
- 您可以在不调用构造函数的情况下调用攻击器吗?
- 在不调用构造函数的情况下创建 Vector 元素
- 将常量字符* 转换为不带构造函数的 std::string
- 使用列表初始化的不明确构造函数调用
- 为什么Visual Studio的Intellisense不显示构造函数?