Инициализация членов базового класса с использованием оператора разрешения области [дубликат]

Это может быть переносное решение. Соответствует стандартам.

#include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>
#include<sstream>

std::string ssystem (const char *command) {
    char tmpname [L_tmpnam];
    std::tmpnam ( tmpname );
    std::string scommand = command;
    std::string cmd = scommand + " >> " + tmpname;
    std::system(cmd.c_str());
    std::ifstream file(tmpname, std::ios::in );
    std::string result;
        if (file) {
      while (!file.eof()) result.push_back(file.get());
          file.close();
    }
    remove(tmpname);
    return result;
}

    //for cygwin

int main(int argc, char *argv[])
{
        std::string bash = "FILETWO=/cygdrive/c/*\nfor f in $FILETWO\ndo\necho \"$f\"\ndone ";
    std::string in;
        std::string s = ssystem(bash.c_str());
    std::istringstream iss(s);
        std::string line;
        while ( std::getline(iss, line) )
        {
      std::cout << "LINE-> " + line + "  length: " << line.length() << std::endl;
        }
    std::cin >> in;
    return 0;
}
2
задан Yang 10 May 2013 в 15:31
поделиться

2 ответа

Вы должны изменить Shape(double w, double h) на Shape(w, h). Фактически вы вызываете базовый конструктор.

Кроме того, вам не нужно устанавливать width и height в тело конструктора производного класса:

  Rectangle(double w, double h) : Shape(w, h)
  {}

. Это связано с тем, что в списке инициализаторов Shape(w, h) вызывается конструктор базового класса (shape), который будет устанавливать эти значения для вас.

Когда производный объект создается, Выполнено:

  1. Память для Shape выделена
  2. Соответствующий базовый конструктор называется
  3. Список инициализации инициализирует переменные
  4. Тело конструктора исполняется
  5. Элемент управления возвращается вызывающему

. В вашем примере подобъект Shape инициализируется Shape(double w = 0, double h = 0, double r = 0). В этом процессе все элементы базовой части (width, height, radius) инициализируются базовым конструктором. После этого выполняется тело производного конструктора, но вам ничего не нужно менять, поскольку все они заботятся о базовом конструкторе.

2
ответ дан Yang 19 August 2018 в 07:53
поделиться
  • 1
    Тело конструктора Shape? Может ли это быть пустым? – user2302335 10 May 2013 в 05:52
  • 2
    @ user2302335 Я имею в виду тело конструктора Rectangle. – Yang 10 May 2013 в 05:53

Почти. Вместо того, чтобы обновлять параметры здесь:

Rectangle(double w, double h) : Shape(double w, double h)

Вы должны просто «передать их» (чтобы дать неточную формулировку):

Rectangle(double w, double h) : Shape(w, h)
{ }
0
ответ дан Yuushi 19 August 2018 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: