Форум программистов, компьютерный форум CyberForum.ru

Разделение данных и логики и ООП - C++

Восстановить пароль Регистрация
 
ReDoX
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 10
10.07.2015, 14:56     Разделение данных и логики и ООП #1
Тренируюсь в ООП и вообще в C++ и появилась неприятная ошибка. Есть конструктор в классе BaseHouse:

C++
1
BaseHouse(unsigned int height, unsigned int width, unsigned int square);
И класс, который наследует BaseHouse и в нем конструктор:

C++
1
2
3
4
5
class House : BaseHouse {
 public:
  House(unsigned int height, unsigned int width, unsigned int square,
        unsigned int number, const std::string& name);
}
Собственно вопрос: почему нельзя наследовать конструктор сразу в .h файле?

C++
1
2
3
4
5
6
class House : public BaseHouse {
 public:
  House(unsigned int height, unsigned int width, unsigned int square,
        unsigned int number, const std::string& name)
    : BaseHouse(height, width, square);
}
Выкидывает исключение - "expected «{» at end of input".

К примеру, у кого - то есть только .h файл, откуда он узнает, что этот конструктор в реализации вызывает базовый конструктор?

Полный код, если кому - нибудь требуется:

Кликните здесь для просмотра всего текста

base_house.h:

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#ifndef HOUSE_BASE_HOUSE_H_
#define HOUSE_BASE_HOUSE_H_
 
/**
 * @file
 * @class BaseHouse
 * @brief Базовый класс для всех домов
 */
class BaseHouse {
 public:
  /**
   * @brief Стандартный конструктор
   * @details Инициализирует все поля нулем
   */
  BaseHouse();
  /**
   * @brief Устанавливает значения аргументов равным соответствующим полям в классе
   * @param[in] height Искомая высота
   * @param[in] width  Искомая ширина
   * @param[in] square Искомая площадь
   */
  BaseHouse(unsigned int height, unsigned int width, unsigned int square);
  /**
   * @brief Возвращает искомую высоту
   * @return Поле height_
   */
  unsigned int get_height();
  /**
   * @brief Возвращает искомую ширину
   * @return Поле width_
   */
  unsigned int get_width();
  /**
   * @brief Возвращает искомую площадь
   * @return Поле square_
   */
  unsigned int get_square();
  /**
   * @brief Устанавливает высоту равную аргументу
   * @param[in] height Искомая высота
   */
  void set_height(unsigned int height);
  /**
   * @brief Устанавливает щирину равную аргументу
   * @param[in] width Искомая высота
   */
  void set_width(unsigned int width);
  /**
   * @brief Устанавливает площадь равную аргументу
   * @param[in] height Искомая высота
   */
  void set_square(unsigned int height);
 protected:
  unsigned int height_; ///< Высота
  unsigned int width_;  ///< Ширина
  unsigned int square_; ///< Прощадь
};
 
#endif // HOUSE_BASE_HOUSE_H_


base_house.cc:

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "base_house.h"
 
#include <iostream>
 
BaseHouse::BaseHouse() {
  std::cout << "Создан дом" << std::endl;
 
  height_ = 0;
  width_ = 0;
  square_ = 0;
}
BaseHouse::BaseHouse(unsigned int height, unsigned int width,
                     unsigned int square) {
  std::cout << "Создан дом" << std::endl;
 
  height_ = height;
  width_ = width;
  square_ = square;
}
 
unsigned int BaseHouse::get_height() {
  return height_;
}
unsigned int BaseHouse::get_width() {
  return width_;
}
unsigned int BaseHouse::get_square() {
  return square_;
}
 
void BaseHouse::set_height(unsigned int height) {
  height_ = height;
}
void BaseHouse::set_width(unsigned int width) {
  width_ = width;
}
void BaseHouse::set_square(unsigned int square) {
  square_ = square;
}


house.h:

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef HOUSE_H_
#define HOUSE_H_
 
#include <string>
 
#include "base_house.h"
 
/**
 * @file
 * @class House
 * @brief Дочерний класс BaseHouse
 */
class House : public BaseHouse {
 public:
  /**
   * @brief Стандартный конструктор
   * @details Инизиализует все поля нулем
   */
  House();
  /**
   * @brief Устанавливает значения аргументов равным соответствующим полям в классе
   * @param[in] height Искомая высота
   * @param[in] width  Искомая ширина
   * @param[in] square Искомая площадь
   * @param[in] number Искомый номер
   * @param[in] name   Искомое имя
   */
  House(unsigned int height, unsigned int width, unsigned int square,
        unsigned int number, const std::string& name);
  /**
   * @brief Возвращает искомый номер
   * @return Поле number_
   */
  unsigned int get_number();
  /**
   * @brief Возвращает искомое имя
   * @return Поле name_
   */
  std::string get_name();
  /**
   * @brief Устанавливает номер равный аргументу
   * @param[in] number Искомый номер
   */
  void set_number(unsigned int number);
  /**
   * @brief Устанавливает имя равное аргументу
   * @param[in] name Искомое имя
   */
  void set_name(const std::string& name);
 private:
  unsigned int number_;  ///< Номер
  std::string name_;    ///< Имя
};
 
#endif // HOUSE_H_


house.cc:

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "house.h"
 
House::House()
    : BaseHouse::BaseHouse() {
  number_ = 0;
  name_ = "";
}
House::House(unsigned int height, unsigned int width, unsigned int square,
             unsigned int number, const std::string& name)
    : BaseHouse(height, width, square) {
  number_ = number;
  name_ = name;
}
 
unsigned int House::get_number() {
  return number_;
}
std::string House::get_name() {
  return name_;
}
 
void House::set_number(unsigned int number) {
  number_ = number;
}
void House::set_name(const std::string& name) {
  name_ = name;
}


Также, добавил исходники в архив.



P.S. Под разделением данных и логики имелось в виду, что код будет в .cc файле, а все объявления в .h файле.
Вложения
Тип файла: 7z src.7z (1.6 Кб, 0 просмотров)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1855 / 1651 / 575
Регистрация: 14.05.2014
Сообщений: 4,737
Записей в блоге: 1
Завершенные тесты: 5
10.07.2015, 15:02     Разделение данных и логики и ООП #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
ReDoX, можно, добавьте после BaseHouse(height, width, square) пустые фигурные скобки, а после скобок не ставьте точку с запятой.
ReDoX
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 10
10.07.2015, 15:28  [ТС]     Разделение данных и логики и ООП #3
Я думал о таком варианте, но можно как - то обойтись без этих скобок? Вариант то рабочий, просто не красиво выглядит)
Или компиляторы такое еще не умеют?
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
10.07.2015, 16:44     Разделение данных и логики и ООП #4
Цитата Сообщение от ReDoX Посмотреть сообщение
Я думал о таком варианте, но можно как - то обойтись без этих скобок? Вариант то рабочий, просто не красиво выглядит)
Или компиляторы такое еще не умеют?
Нельзя. Выглядит отлично. В этих скобках еще можно что-то написать, если требуется.

Уметь такое компиляторы не будут никогда, ибо это выбивается из общей концепции.
ReDoX
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 10
10.07.2015, 18:56  [ТС]     Разделение данных и логики и ООП #5
Выглядит конечно хорошо, но когда везде точка с запятой, а тут скобка, немного некрасиво выглядит.
Но все же, спасибо за ответы, проблема решена.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
10.07.2015, 19:09     Разделение данных и логики и ООП #6
Цитата Сообщение от ReDoX Посмотреть сообщение
но когда везде точка с запятой, а тут скобка, немного некрасиво выглядит.
Ну она далеко не везде ставится.
Вот определение функции:
C++
1
2
3
4
void foo()
{
 
}
тоже никаких точек с запятой
Yandex
Объявления
10.07.2015, 19:09     Разделение данных и логики и ООП
Ответ Создать тему
Опции темы

Текущее время: 05:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru