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

时间:2016-10-17 21:57:23

标签: c++ static private getter

我正在使用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返回它。 / p>

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

不确定这是否是最终答案,但要删除"静态"从实施。你不应该写两次!

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

答案 2 :(得分: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;
}