Объяснение синтаксиса конструктора C ++ - PullRequest
1 голос
/ 26 февраля 2011

Я просматривал учебник по созданию AST с помощью Clang / LLVM .

Я вижу этот синтаксис там:

struct PPContext {
  // Takes ownership of client.
  PPContext(clang::DiagnosticClient* client = 0,
            const std::string& triple = LLVM_HOSTTRIPLE)
    : diagClient(client == 0?new clang::TextDiagnosticPrinter:client),
      diags(diagClient),
      target(clang::TargetInfo::CreateTargetInfo(triple)),
      headers(fm),
      pp(diags, opts, *target, sm, headers)
  {
    // Configure warnings to be similar to what command-line `clang` outputs
    // (see tut03).
    // XXX: move warning initialization to libDriver
    using namespace clang;
    diags.setDiagnosticMapping(diag::kind,diag::MAP_IGNORE);
//diag::warn_pp_undef_identifier was the initial value instead of diag::kind. But I changed since it gave error.
  }

  ~PPContext()
  {
    delete diagClient;
    delete target;
  }

  clang::DiagnosticClient* diagClient;
  clang::Diagnostic diags;
  clang::LangOptions opts;
  clang::TargetInfo* target;
  clang::SourceManager sm;
  clang::FileManager fm;
  clang::HeaderSearch headers;
  clang::Preprocessor pp;
};

И:

//What is the constructor doing here ? The construct looks very different and difficult to comprehend !!!
// Could someone break it up for me ?
PPContext(clang::DiagnosticClient* client = 0,
            const std::string& triple = LLVM_HOSTTRIPLE)
    : diagClient(client == 0?new clang::TextDiagnosticPrinter:client),
      diags(diagClient),
      target(clang::TargetInfo::CreateTargetInfo(triple)),
      headers(fm),
      pp(diags, opts, *target, sm, headers)
  {
    // Configure warnings to be similar to what command-line `clang` outputs
    // (see tut03).
    // XXX: move warning initialization to libDriver
    using namespace clang;
    diags.setDiagnosticMapping(diag::kind,diag::MAP_IGNORE);
//diag::warn_pp_undef_identifier was the initial value instead of diag::kind. But I changed since it gave error.
  }

Пожалуйста, дайте мне знать, если есть какой-либо другой материал, который будет полезен и полезен для обучения.Спасибо

Ответы [ 3 ]

2 голосов
/ 26 февраля 2011

Это инициализаторы конструктора. Они инициализировали учеников со значением, данным им. Например:

class TestClass
{
private:
    int someField;

public:
    TestClass() : someField(5) { }
};

Инициализирует элемент someField со значением 5 во время вызова конструктора TestClass (). Вы можете разделить несколько инициализаторов с помощью , для инициализации нескольких членов. Вы также можете передать параметры из конструктора в эти инициализаторы, такие как:

class TestClass
{
private:
    int someField;

public:
    TestClass(int _someField) : someField(_someField) { }
};

Когда вызывается этот конструктор, значение, переданное _someField, будет использовано для инициализации someField.

Также рассмотрите наследование. Используя второй TestClass в качестве нашей базы, мы получаем следующий производный тип:

class TestClassDerived : public TestClass
{
public:
    TestClassDerived(int _someField) : TestClass(_someField) { }
};

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

1 голос
/ 26 февраля 2011

Он называется списком инициализации конструктора, который используется для наследования и инициализации переменных-членов.Нажмите эту ссылку для хорошего объяснения этой темы.

Один сценарий, который требуется, связан с наследованием.Рассмотрим следующее:

class Base
{
public:
    Base(int n)
    {
    }
};

class Derived : Base
{
public:
    // Error! How do we construct Base? We never pass n
    // to the constructor of Base.
    Derived(int n)
    {
    }
};

Как мы можем изменить вышеперечисленное для компиляции?Со списком инициализации конструктора:

class Base
{
public:
    Base(int n)
    {
    }
};

class Derived : Base
{
public:
    // Now your compiler is happy.
    Derived(int n) : Base(n)
    {
    }
};
0 голосов
/ 26 февраля 2011

Этот конструктор имеет формат

PPContext(arg1, arg2)
    : initConstructor1,
      ...,
      initConstructor5

где вы можете обменять initConstructor на конструкторы инициализации члены PPContext

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...