私はちょっとしたアプリケーションにC++を使用しています。 仮想メソッドを持つ親クラスが1つあります。ヘッダファイルです。仮想関数から継承した静的関数を定義する方法は?
class personDB:public person
{
public:
unsigned int id;
public:
personDB();
personDB(QString dbName, QString dbSurname);
personDB(QString dbName, QString dbSurname, unsigned int dbid);
personDB(std::string dbName, std::string dbSurname, unsigned int dbid);
virtual std::string getTableName();
unsigned int getID(void);
void setID(unsigned int myID);
private:
static const std::string tableName;
};
このクラスは異なる子クラスによって継承されます。各子クラスは、* .cppファイル内の異なる値を割り当てるtableName
属性を再定義します。属性はプライベートであり、ゲッターによって返されます。ここでは、子クラスの一つの例として ヘッダファイルです:
#include "persondb.h"
class ScriptBy : public personDB
{
public:
ScriptBy();
ScriptBy(QString dbName, QString dbSurname);
ScriptBy(QString dbName, QString dbSurname, unsigned int dbid);
std::string getTableName();
protected:
static const std::string tableName;
};
私は機能getTableNameを(したい)クラスのメンバ関数、それは同じクラスのすべてのインスタンスに対して同じ値を返すようにクラスのインスタンスがなくても呼び出すことができます。これは、私が間違っていない場合には、ヘッダファイルに関数宣言の前にキーワードstatic
を入れて行う必要があります。しかし、このようにコンパイルしようとすると、親クラスの関数が仮想宣言されたという事実に関連するエラーが出ます。 私が手にエラーがこれです:
In file included from ../../singlestory.h:4:0,
from ../../volume.h:5,
from ../../dbinterface.h:8,
from ../../dbinterface.cpp:1:
../../scriptby.h:12:24: error: ‘static std::__cxx11::string ScriptBy::getTableName()’ cannot be declared
static std::string getTableName();
^
In file included from ../../dbinterface.h:7:0,
from ../../dbinterface.cpp:1:
../../persondb.h:15:25: error: since ‘virtual std::__cxx11::string personDB::getTableName()’ declared in base class
virtual std::string getTableName();
継承されたクラスのメンバ関数は静的にする方法はありますか?
EDIT:関数を静的にすることができない場合、クラスのインスタンスなしでprivate属性を外部にアクセスできるようにするにはどうすればよいですか?