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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
#1

Где создавать объекты классов? - C++

18.04.2013, 11:28. Просмотров 1097. Ответов 24
Метки нет (Все метки)

Здравствуйте. Подскажите, если есть много классов, объявленных в заголовочных файлах,
а определенных в *.cpp - файлах, и для каждого класса создается объект, где эти объекты правильно создавать.
Я создаю их там где они оказываются нужны в первый раз. Например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// A.cpp
#include "B.cpp"
class A {
    B objB;
};
 
// B.cpp
#include "A.cpp"
#include "C.cpp"
class B {
    A objA;
    C objC;
};
 
//C.cpp
#include "B.cpp"
class C {
    B objB;
};
А то у меня создание объектов разбросано по всей программе,
может это нужно делать где-то в одном месте? (обычно подключаю *.h - файлы, а не *.cpp, как здесь,
не стал писать, чтоб упростить пример)

И правильно-ли, что объекты нужно создавать только в *.cpp - файлах, а в *.h - нельзя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2013, 11:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где создавать объекты классов? (C++):

Считается ли хорошим тоном создавать объекты классов в области глобальных переменных - C++
Считается ли хорошим тоном создавать объекты классов в области глобальных переменных? class FX { ........ ......... };

Стек или куча: как "правильно" создавать объекты классов? - C++
У меня несколько странновато-ламерский вопрос, но ведь в том и смысл: чтобы таких вопросов не осталось, на них один фиг сначала нужно...

Преобразования объектов классов в объекты других классов - C++
Задача типа обмен валют. Нужно конвертировать старый фунт стерлинг(фунт, шиллинг и пенсы) в доллары и обратно, по курсу 1 фунт = 50...

Как создавать в цикле разные объекты одной структуры? - C++
Допустим есть структура которая представляет из себя ячейку которая хранит данные по координатам X Y Z и некоторые свойства этой ячейки. ...

При выделении памяти через malloc, как создавать объекты ? - C++
Выделяю память через malloc под 4 объекта, как их создать ? myClass * ptr = (myClass*) malloc(sizeof(myClass)*4); for(int i = 0;...

Указатель на объекты и члены классов - C++
class AA { public: void Start( ); }; class BB { public: void Start( );

24
shuffle
19 / 19 / 1
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 13:04 #2
Цитата Сообщение от dimkaok Посмотреть сообщение
обычно подключаю *.h - файлы, а не *.cpp, как здесь,
не стал писать, чтоб упростить пример
Не делайте так, это не упрощает пример, а, напротив, запутывает.

Если вы под созданием объекта подразумеваете определение его в качестве члена другого класса, то, конечно, он должен быть определен в месте объявления класса, то есть в соответствующем .h файле.
0
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
18.04.2013, 13:35  [ТС] #3
То есть вот так сделать? Объявить объект в *.h - файле родного класса?

// Test.h
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
class CTest {
 
  public:
 
      void display ()
        { std::cout << "Hello" << std::endl; }
};
// Test.cpp
C++
1
2
3
4
5
6
#include "Test.h"
 
CTest obj;
 
void CTest::display ()
        { std::cout << "Hello" << std::endl; }
main.cpp
C++
1
2
3
4
5
6
7
8
#include "Test.h"
 
int main(int argc, char** argv) {
 
    obj.display();     // Error: Идентификатор obj не определен
 
    return 0;
}
Но тогда как в функции main обратиться через созданный объект к функции display()?
0
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
18.04.2013, 13:41 #4
Класс - тип данных, а объекты - это переменные.
Для себя я определяю int так:
C++
1
int abc; // int - класс, abc - объект
Так что, создание объектов классов и переменных основных типов подчинены одному и тому же закону.
1
shuffle
19 / 19 / 1
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 13:45 #5
Цитата Сообщение от dimkaok Посмотреть сообщение
Но тогда как в функции main обратиться через созданный объект к функции display()?
Значит, я вас неправильно понял.

Нет, в таком случае создавать объекты нужно в месте их использования.
C++
1
2
3
4
5
6
7
8
#include "Test.h"
 
int main(int argc, char** argv) {
    CTest obj;
    obj.display();
 
    return 0;
}
1
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
18.04.2013, 13:57  [ТС] #6
А можно объявить один и тот-же объект определенного класса в разных файлах несколько раз?
Или если определили объект obj класса A, то больше этого делать в программе нельзя?
0
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
18.04.2013, 14:03 #7
Цитата Сообщение от dimkaok Посмотреть сообщение
А можно объявить один и тот-же объект определенного класса в разных файлах несколько раз?
В смысле одного и того же имени? Опять, такая же ситуация, как и с обычными типами данных. Если в одной области видимости, но разные наименования, в разных областях видимости - можно повторять наименования.
1
shuffle
19 / 19 / 1
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 14:12 #8
Цитата Сообщение от dimkaok Посмотреть сообщение
А можно объявить один и тот-же объект определенного класса в разных файлах несколько раз?
Или если определили объект obj класса A, то больше этого делать в программе нельзя?
Да, если сделать объект глобальным и объявить с директивой extern. Например:

C++
1
2
3
4
5
// Test.h
 
class CTest { ... }; // пропущу объявление для краткости
 
extern CTest obj; // объявление общей переменной
C++
1
2
3
4
5
// Test.cpp
// определение методов класса
void CTest::display () { ... }
 
CTest obj; // определение, обязательно в cpp
Теперь объект obj можно использовать в разных cpp файлах, подключая Test.h:
C++
1
2
3
4
#include "Test.h"
void foo() {
  obj.display();
}
Однако сразу хочу предупредить, что использование глобальных данных приводит к плохой и немасштабируемой архитектуре. Избегайте их.
1
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
18.04.2013, 14:36  [ТС] #9
Ага, вроде понял. А еще такой вопрос:

У меня были объекты объявлены в *.cpp - файлах, я перенес объявления в *.h - файлы,
вроде ошибок не выдает. Правильно-ли, что я поместил объявление объектов в public - часть класса?

Добавлено через 5 минут
И еще, как я понял, если я объявил объект в классе А, а он (объект) мне понадобится
в классе В, то в классе В мне просто нужно будет подключить хеадер класса А?
0
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
18.04.2013, 14:40 #10
Цитата Сообщение от dimkaok Посмотреть сообщение
Правильно-ли, что я поместил объявление объектов в public - часть класса?
Все зависит от логики использования класса. Если объекты относяться к реализации класса, а из-вне они не используются, то в protected или в private. Но даже если они и используются, на мой взгляд необходимо сделать геттер и сеттер (функция возвращающая поле класса и устанавливающая его).
Кликните здесь для просмотра всего текста
Еще раз - также как и с переменными


Добавлено через 1 минуту
Цитата Сообщение от dimkaok Посмотреть сообщение
И еще, как я понял, если я объявил объект в классе А, а он (объект) мне понадобится
в классе В, то в классе В мне просто нужно будет подключить хеадер класса А?
Вы под объектом подразумеваете один объект? или два объекта одного и того же класса?
0
shuffle
19 / 19 / 1
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 14:40 #11
Цитата Сообщение от dimkaok Посмотреть сообщение
Правильно-ли, что я поместил объявление объектов в public - часть класса?
Похоже мы снова говорим немного на разных языках. Давайте определимся так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Test.h
 
// ниже [B]объявление[/B] класса
class CTest {
public:
  void foo();
 
private:
  int data_; // [B]определение[/B] члена класса
};
 
extern CTest obj; // [B]объявление[/B] объекта класса
 
...
// Test.cpp
 
void CTest::foo() {} // [B]определение[/B] метода класса
 
CTest obj; // [B]определение[/B] объекта класса
Итак, если речь про члены класса, их лучше определять в private-секции.
1
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
18.04.2013, 14:49  [ТС] #12
Цитата Сообщение от StasGamilton Посмотреть сообщение
Еще раз - также как и с переменными
Все никак в голове не увяжется Даже не думал, что для объектов, как и для переменных используются геттеры и сеттеры

Цитата Сообщение от StasGamilton Посмотреть сообщение
Вы под объектом подразумеваете один объект? или два объекта одного и того же класса?
Да, если я использую один единственный объект

Цитата Сообщение от shuffle Посмотреть сообщение
если речь про члены класса, их лучше определять в private-секции.
Ненене, я имею ввиду объявление объекта класса, как здесь: extern CTest obj;
Здесь он объявлен за пределами класса, а у меня объявлен внутри класса в public - части,
чтоб его другие классы могли использовать, и работает. Правильно внутри класса объявлять, или
за его пределами?
0
shuffle
19 / 19 / 1
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 14:54 #13
Цитата Сообщение от dimkaok Посмотреть сообщение
Правильно внутри класса объявлять, или
за его пределами?
Внутри класса, безусловно, лучше, чем глобальное определение. А делать ли член класса public или private или protected — второстепенный вопрос. Общая рекомендация — чем более закрытая область используется, тем лучше. Если вам не нужны наследники, указываетй private секцию и для доступа напишите геттер (сеттер, если необходимо), как указывали выше.
1
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
18.04.2013, 17:14  [ТС] #14
Ага, понял, спасибо. А то у меня в коде каша полная
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.04.2013, 17:22 #15
Цитата Сообщение от dimkaok Посмотреть сообщение
Здравствуйте. Подскажите, если есть много классов, объявленных в заголовочных файлах,
а определенных в *.cpp - файлах, и для каждого класса создается объект, где эти объекты правильно создавать.
Я создаю их там где они оказываются нужны в первый раз. Например:
Нет. Если первый раз тебе объект понадобился в функции и ты там его создал, то в другой функции объекта не будет. Он нужен в единственном месте? Тогда ты поступил правильно. Нет? Ну значит нет. Не в том дело, где объект нужен первый раз, а где он вообще нужен. В принципе. В той области видимости и создавай.

Добавлено через 2 минуты
Цитата Сообщение от dimkaok Посмотреть сообщение
Правильно-ли, что я поместил объявление объектов в public - часть класса?
Объект нельзя разместить внутри его класса, рекурсия типов запрещена, исключение сделано только для указателей.

Добавлено через 1 минуту
Цитата Сообщение от dimkaok Посмотреть сообщение
И еще, как я понял, если я объявил объект в классе А, а он (объект) мне понадобится
в классе В, то в классе В мне просто нужно будет подключить хеадер класса А?
Нет. Головы инкладятся к файлам, но не к классам. И объект не может быть частью своего класса.

Добавлено через 44 секунды
Цитата Сообщение от StasGamilton Посмотреть сообщение
Все зависит от логики использования класса. Если объекты относяться к реализации класса, а из-вне они не используются, то в protected или в private. Но даже если они и используются, на мой взгляд необходимо сделать геттер и сеттер (функция возвращающая поле класса и устанавливающая его).
Ещё один такой же.
1
18.04.2013, 17:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2013, 17:22
Привет! Вот еще темы с ответами:

Объекты классов в динамической памяти - C++
Я создаю объект класса в динамической памяти ( например map *obj = new map; ) Вопрос: как сделать трехмерый(или хотя бы двумерный) массив...

Использование классов в С++. Простые объекты. - C++
Задание: Описать объект, включающий заданные поля и методы. Написать программу, которая создает массив объектов и список объектов и...

Файлы и объекты производных классов - C++
Вопрос следующий: имеется два класса, базовый и производный. В файл бинарно записывается объект производного класса через указатель на...

Как создавать конструкторы, что бы использовать переменные из любых классов? - C++
В общем пишу программку, суть в том , что я должен научиться спокойно использовать переменные из разных классов в разных классах и в int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru