2016-10-17 3 views
-3

Я использую C++ для небольшого моего проекта. Я хочу определить статическую константную строку в файле заголовка класса и вернуть эту строку с помощью (статического) геттера. Вот файл заголовка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;

Я заметил, что если я делаю имя_таблицы общественности все в порядке: могу ли я сохранить этот член класса приватным и вернуть его со статическим общественным добытчика в C++.

+1

*** static std :: string getTableName() {*** Вы определили глобальную функцию, не являющуюся членом вашего класса. – drescherjm

+1

Файлы заголовков объявляют ** член ** функцию с именем 'getTableName()'; .cpp-файл определяет ** функцию non-member ** с именем 'getTableName()'. –

+0

Почему ваши люди заставляют меня болеть за использование этого сайта и болеть за обучение: я пытался искать ответы и решения, но это были не мои дела. –

ответ

1

Не уверен, является ли это окончательным ответом, но удалите это «статическое» из реализации. Вы не должны писать это дважды!

Вы должны написать эти ключевые слова только один раз внутри класса, чтобы объявить, что эта функция является статической.

+0

Это часть проблемы; это нормально, как написано, потому что функция ** определена ** не является функцией-членом, но это было бы неправильно для функции-члена. –

+0

@PeteBecker Вот что я имел в виду :) –

+0

удаление статического ключевого слова не решает мою проблему: он дает мне ту же ошибку. –

4

Вы объявили сорбент как метод этого класса, так что вы должны определить его так же, как и любой другой метод:

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

static ключевое слово используется только объявить метод класса как статические, и не участвует в определении фактического метода.

+0

удаление статического ключевого слова не решает мою проблему: он дает мне ту же ошибку. Я попробовал вашу реализацию, но это дает мне ту же ошибку. –

+1

Правильно, и поэтому в моем ответе упоминаются и другие вещи. –

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; 
} 
Смежные вопросы