C++ 对非常量对象的引用不能用该对象的r值初始化
我创建了一个对象,并尝试通过引用将该对象传递给多个函数C++ 对非常量对象的引用不能用该对象的r值初始化,c++,C++,我创建了一个对象,并尝试通过引用将该对象传递给多个函数 #include<iostream> #include <string> #include "DBMS.h" using namespace std; void Home(DBMS &); int main() { DBMS dbms(); Home(dbms); // this is where the error is return 0; } void H
#include<iostream>
#include <string>
#include "DBMS.h"
using namespace std;
void Home(DBMS &);
int main()
{
DBMS dbms();
Home(dbms); // this is where the error is
return 0;
}
void Home(DBMS &dbms)
{
string dbName;
dbms.addDatabase(dbName);
}
#包括
#包括
#包括“DBMS.h”
使用名称空间std;
void Home(DBMS&);
int main()
{
DBMS();
Home(dbms);//这就是错误所在
返回0;
}
void Home(数据库管理系统和数据库管理系统)
{
字符串dbName;
addDatabase(dbName);
}
这是DBMS.h
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include "Database.h"
using namespace std;
class DBMS
{
public:
DBMS();
void addDatabase(string);
Database& getDatabase(string);
Database& getDatabaseByIndex(int);
int getDatabaseIndex(string);
void removeDatabase(string);
int size();
~DBMS();
private:
vector <Database> dbList;
string error;
};
DBMS::DBMS()
{
}
void DBMS::addDatabase(string tbNames)
{
vector<string> TB_Names = tokenize(tbNames);
int size = TB_Names.size();
for (int i = 0; i < size; i++)
{
if (getDatabaseIndex(TB_Names[i]) == -1)
{
Database tb(TB_Names[i]);
dbList.push_back(tb);
}
else
throw "Already esited Database with given name";
}
}
Database& DBMS::getDatabase(string tbName)
{
int i;
int size = dbList.size();
for (i = 0; i < size; i++)
{
if (dbList[i].getName() == tbName)
return dbList[i];
}
throw invalid_argument("Database not found");
}
Database& DBMS::getDatabaseByIndex(int index)
{
return dbList[index];
}
void DBMS::removeDatabase(string TB_Name)
{
int i;
int size = dbList.size();
for (i = 0; i < size; i++)
{
if (dbList[i].getName() == TB_Name)
{
dbList.erase(dbList.begin() + i);
break;
}
}
if (i == size)
throw invalid_argument("Field not found");
}
int DBMS::getDatabaseIndex(string TB_Name)
{
int size = dbList.size();
for (int i = 0; i < size; i++)
{
if (dbList[i].getName() == TB_Name)
return i;
}
return -1;
}
int DBMS::size()
{
return dbList.size();
}
DBMS::~DBMS()
{
}
#pragma一次
#包括
#包括
#包括
#包括“Database.h”
使用名称空间std;
类数据库管理系统
{
公众:
数据库管理系统();
void addDatabase(字符串);
数据库&getDatabase(字符串);
数据库&getDatabaseByIndex(int);
int getDatabaseIndex(字符串);
void removeDatabase(字符串);
int size();
~DBMS();
私人:
矢量数据库表;
字符串错误;
};
DBMS::DBMS()
{
}
void DBMS::addDatabase(字符串tbNames)
{
向量TB_名称=标记化(TBName);
int size=TB_Names.size();
对于(int i=0;i
(数据库类型只是我创建的另一个类。它没有什么特别之处。不要担心它(除非您认为我必须这样做))
错误语句是:>类型为“DBMS&”(非常量限定)的引用不能用值“DBMS()初始化”
我发现一个建议,我应该将voidhome(DBMS&DBMS)
修复为voidhome(constdbms&DBMS)
但如果我这样做,我就不能使用addDatabase()函数
如何解决此问题?此声明
DBMS dbms();
这是一个令人烦恼的解析。您没有声明名为dbms
的变量,而是实际声明名为dbms
的函数,该函数不带任何参数,并返回一个dbms
。将此对象传递给需要DBMS
对象的函数将不起作用
您可以通过以下方法解决此问题:
DBMS dbms{};
本声明
DBMS dbms();
这是一个令人烦恼的解析。您没有声明名为dbms
的变量,而是实际声明名为dbms
的函数,该函数不带任何参数,并返回一个dbms
。将此对象传递给需要DBMS
对象的函数将不起作用
您可以通过以下方法解决此问题:
DBMS dbms{};
或者干脆
DBMS
@user253751是的,在这种情况下,有很多方法可以初始化一个变量,我只想显示一个,所以我选择了统一初始化。我现在看到了,觉得自己有点傻。非常感谢。guys@HoNGTH席夫不担心,这就是为什么它会烦恼:如果它解决了你的问题,就考虑接受这个答案。是的,有很多方法可以初始化。我的答案中的版本有任何问题吗?我不想在没有充分理由的情况下显示多个选项@user253751是的,在这种情况下,有很多方法可以初始化一个变量,我只想显示一个,所以我选择了统一初始化。我现在看到了,觉得自己有点傻。非常感谢。guys@HoNGTH席夫不担心,这就是为什么它会烦恼:如果它解决了你的问题,就考虑接受这个答案。是的,有很多方法可以初始化。我的答案中的版本有任何问题吗?我不想在没有充分理由的情况下显示多个选项。