【问题标题】:C++ how to build a getter of a static private member?C ++如何构建静态私有成员的getter?
【发布时间】:2016-10-17 21:57:22
【问题描述】:

我正在为我的一个小项目使用 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”的私有成员 返回 personDB::tableName;

我注意到,如果我将 tablename 设为公开,一切正常:我可以将这个类成员保持为私有并使用 C++ 中的静态公共 getter 返回它吗?

【问题讨论】:

  • static std::string getTableName(){ 你定义了一个全局函数,而不是你的类的成员。
  • 头文件声明了一个名为getTableName()member函数; .cpp 文件定义了一个名为getTableName()非成员 函数。
  • 我的问题还没有解决
  • 编辑问题并添加persondb.cpp 的第 21 行,因为这是错误所在。您可能需要在第 21 行上方和下方添加几行,以便我们了解一些上下文。
  • 问题对我来说并没有消失我认为你有不止 1 个错误。原始问题中的问题现已修复,但是我们无法在不查看代码的情况下解决 persondb.cpp 中的问题。

标签: c++ static private getter


【解决方案1】:

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

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

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

【讨论】:

  • 删除 static 关键字并不能解决我的问题:它给了我同样的错误。我尝试了你的实现,但它给了我同样的错误。
  • 正确,这就是为什么我的回答也提到了其他几件事。
【解决方案2】:

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

你应该在类中只写一次这些关键字来声明函数是静态的。

【讨论】:

  • 这是问题的一部分;写的没问题,因为被定义的函数不是成员函数,但是对于成员函数就错了。
  • @PeteBecker 这就是我的意思:)
  • 删除 static 关键字并不能解决我的问题:它给了我同样的错误。
  • @Rorschach 从实现中删除它,而不是从定义中删除。即,从类外的版本中删除它。
  • @Rorschach 你也忘了在实现之前添加 Authorddd::。
【解决方案3】:

只有类可以访问私有成员,所以下面将允许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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多