首页 文章

C如何构建静态私有成员的getter?

提问于
浏览
-3

我正在使用C作为我的一个小项目 . 我想在类头文件中定义一个静态常量字符串,并使用(静态)getter返回此字符串 . 这是头文件

//*.h
class Authordd : public personDB
{
    public:
        Authordd();
        Authordd(QString dbName, QString dbSurname);
        Authordd(QString dbName, QString dbSurname, unsigned int dbid);
        static std::string getTableName();
    private:
        static const std::string tableName;
};

这是cpp文件:

const std::string Authordd::tableName = "Author";

Authordd::Authordd():personDB()
{
    ;
}

Authordd::Authordd(QString dbName, QString dbSurname):personDB(dbName, dbSurname)
{
    ;
}


Authordd::Authordd(QString dbName, QString dbSurname, unsigned int dbid):personDB(dbName, dbSurname)
{
    id = dbid;
}

static std::string getTableName(){
    return (Authordd::tableName);
}

编译我得到以下错误:/../persondb.cpp:21:错误:'tableName'是'personDB' return personDB :: tableName的私有成员;

我注意到,如果我将 tablename 公开,一切正常:我可以将此类成员保密,并使用C中的静态公共getter返回它 .

3 回答

  • 1

    您将getter声明为此类的方法,因此您必须像任何其他方法一样定义它:

    std::string Authordd::getTableName(){
        return tableName;
    }
    

    static 关键字仅用于将类方法声明为static,并且它不参与实际的方法定义 .

  • 0

    只有类可以访问私有成员,因此以下内容将允许 main 获取静态私有变量的值:

    //header.h
    #include <string>
    
    class QString {};
    class personDB 
    {
    public:
        personDB() = default;
        personDB(QString dbName, QString dbSurname) {};
    };
    
    class Authordd : public personDB
    {
    public:
        Authordd();
        Authordd(QString dbName, QString dbSurname);
        Authordd(QString dbName, QString dbSurname, unsigned int dbid);
        static std::string getTableName();
    private:
        static const std::string tableName;
        int id;
    };
    

    在以下文件中,我们可以编写 getTableName() 来调用 Authordd::getTableName() .

    //main.cpp
    #include <iostream>
    #include "header.h"
    
    const std::string Authordd::tableName = "Author";
    
    Authordd::Authordd() :personDB()
    {
    }
    
    Authordd::Authordd(QString dbName, QString dbSurname) : personDB(dbName, dbSurname)
    {
    }
    
    
    Authordd::Authordd(QString dbName, QString dbSurname, unsigned int dbid) :personDB(dbName, dbSurname)
    {
        id = dbid;
    }
    
    std::string Authordd::getTableName()
    {
        return Authordd::tableName;
    }
    
    static std::string getTableName() {
        return Authordd::getTableName();
    }
    
    int main()
    {
        auto author_name = getTableName();
        std::cout << author_name << '\n';
        return 0;
    }
    
  • 4

    不确定这是否是最终答案,但从实现中删除“静态” . 你不应该写两次!

    您应该只在类中编写一次这些关键字,以声明该函数是静态的 .

相关问题