447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
1

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

10.07.2015, 14:56. Показов 1985. Ответов 5
Метки нет (Все метки)

Тренируюсь в ООП и вообще в 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 Кб, 1 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2015, 14:56
Ответы с готовыми решениями:

Разделение логики и данных
В общем в универе препод говорит при написании прог на шарпе в студии, нужно всегда делать проект...

Разделение представления от логики
Здравствуйте. Пишу на ASP.NET не так давно, но последнее время кажется мне, что с моим кодом что-то...

Разделение логики и представления
Здравствуйте! Есть сайт, содержаий информацию о компании, ее продукции, формы контакта/заказа,...

Разделение логики игры
Здравствуйте. Делю логику игры Виселица и есть ошибки, которые я не знаю, как исправить. 1. Я...

5
Эксперт PHP
3102 / 2587 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
10.07.2015, 15:02 2
Лучший ответ Сообщение было отмечено ReDoX как решение

Решение

ReDoX, можно, добавьте после BaseHouse(height, width, square) пустые фигурные скобки, а после скобок не ставьте точку с запятой.
1
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
10.07.2015, 15:28  [ТС] 3
Я думал о таком варианте, но можно как - то обойтись без этих скобок? Вариант то рабочий, просто не красиво выглядит)
Или компиляторы такое еще не умеют?
0
17086 / 9115 / 2230
Регистрация: 30.01.2014
Сообщений: 15,887
10.07.2015, 16:44 4
Цитата Сообщение от ReDoX Посмотреть сообщение
Я думал о таком варианте, но можно как - то обойтись без этих скобок? Вариант то рабочий, просто не красиво выглядит)
Или компиляторы такое еще не умеют?
Нельзя. Выглядит отлично. В этих скобках еще можно что-то написать, если требуется.

Уметь такое компиляторы не будут никогда, ибо это выбивается из общей концепции.
1
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
10.07.2015, 18:56  [ТС] 5
Выглядит конечно хорошо, но когда везде точка с запятой, а тут скобка, немного некрасиво выглядит.
Но все же, спасибо за ответы, проблема решена.
0
17086 / 9115 / 2230
Регистрация: 30.01.2014
Сообщений: 15,887
10.07.2015, 19:09 6
Цитата Сообщение от ReDoX Посмотреть сообщение
но когда везде точка с запятой, а тут скобка, немного некрасиво выглядит.
Ну она далеко не везде ставится.
Вот определение функции:
C++
1
2
3
4
void foo()
{
 
}
тоже никаких точек с запятой
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2015, 19:09
Помогаю со студенческими работами здесь

Разделение логики игры от рендера картинки
Сейчас пишу 2D морской бой с использованием SDL. Сделано главное меню, а также &quot;этап&quot; расстановки...

Разделение данных между пользователями БД. Назначение нормы обработки данных в день
Добрый день уважаемые форумчане! Столкнулась с острой необходимость реализовать следующее: ...

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

ООП.Разработать структуру элементов данных класса в виде динамической структуры данных
Здравствуйте, получил задание, но немного недопонимаю как это сделать, с чего начать. Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru