Пожалуйста, ознакомьтесь со следующим синтаксисом C ++ и его смыслом! (возможно, случай перегрузки) - PullRequest
2 голосов
/ 16 августа 2011

Я прошёл через наследие и нашел следующий синтаксис C ++ странным:

определение класса выглядит следующим образом:

class thread_shared : public master
{
public:
    thread_shared() 
    {
        thread_id = 0;
    }
    int thread_id;
    std::string title;
    std::string (*text2html)(std::string const &);  // What's this declaration?

};

и определение text2html как:

namespace {
    std::string text2html(std::string const &s)
    {
        std::string tmp=cppcms::util::escape(s);
        std::string res;
        res.reserve(tmp.size());
        for(unsigned i=0;i<tmp.size();i++) {
            if(tmp[i]=='\n') {
            res+="<br />";
            }
            res+=tmp[i];
        }
        return res;
    }
}

, а затем использование, которое:

c.id = 1; // any integer
c.title = "some string";        
c.text2html = text2html;   // whats this??

где c - это экземпляр класса thread_shared, объявленного выше.

Как указано выше, кто-то может объяснить мне заявление, например:

std::string (*text2html)(std::string const &);, а затем c.text2html = text2html;

что именно делает код выше?

Ответы [ 4 ]

11 голосов
/ 16 августа 2011
std::string (*text2html)(std::string const &);  // What's this declaration?

Это определение указателя функции.Он объявляет переменную text2html как указатель на функцию с подписью std::string (std::string const &).

c.text2html = text2html;   // whats this??

То есть указатель ссылается на функцию text2html с соответствующей подписью.Правая часть является идентификатором функции и распадается на &text2html, который в этом случае разрешается в адрес в безымянном пространстве имен.

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

std::string foo( std::string const & ) {}
c.text2html = &foo;  // & optional
3 голосов
/ 16 августа 2011

std::string (*text2html)(std::string const &); - это объявление указателя на функцию, которая принимает std::string const & в качестве аргумента и возвращает std::string.

c.text2html = text2html инициализирует этот указатель функцией text2html

3 голосов
/ 16 августа 2011

text2html в thread_shared - это так называемый указатель на функцию.Этот указатель затем назначается для указания на функцию text2html.

1 голос
/ 16 августа 2011

Здесь происходит конфликт имен: text2html используется как имя поля класса thread_shared, а также как функция.

Первая часть:

std::string (*text2html)(std::string const &);

Определяет поле указателя функции с именем text2html в классе thread_master. В частности, поле является указателем на функцию с такой подписью:

std::string foo(std::string const&);

Линия

c.text2html = text2html

назначает функцию text2html, определенную во втором блоке кода, для поля 'text2html' в c.

Вы можете так же легко определить функцию

std::string pants(std::string const& dude) { return dude + " has red pants";}

и затем присвоить его c:

c.text2html = pants;

...