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席夫不担心,这就是为什么它会烦恼:如果它解决了你的问题,就考虑接受这个答案。是的,有很多方法可以初始化。我的答案中的版本有任何问题吗?我不想在没有充分理由的情况下显示多个选项。