Всем привет! Ответьте пожалуйста на вопрос. Можно ли создать класс в одном файле, создать объект класса в другом, а использовать объект в третьем? Если да, то как? Немного поясню: Есть файл person.h - там класс Person Есть файл create_person.h или .cpp - там создаются объект класса Person. Person Vasya. Есть файл main.cpp - там нужно использовать объект Vasya. Можно ли так сделать. Пробовал создать класс и объект в одном заголовочном файле - main.cpp видит класс, но не видит объект.
Можно ли создать класс в одном файле, создать объект класса в другом, а использовать объект в третьем? Если да, то как? Немного поясню: Есть файл person.h - там класс Person Есть файл create_person.h или .cpp - там создаются объект класса Person. Person Vasya. Есть файл main.cpp - там нужно использовать объект Vasya. Можно ли так сделать. Пробовал создать класс и объект в одном заголовочном файле - main.cpp видит класс, но не видит объект.
Привет. Так делать нельзя. Т.е. компилятор тебе разрешит, как тут насоветовали выше, но это будет просто каша, в которой потом запутаешься. Или не дай бог другой человек заглянет в код и его хватит кондрашка.
Person::Person(){ age = 18; weight = 75; name = "Wasserman" }
Person::~Person(){ }
void Person::Shout(){ std::cout << "I am" << name << "!\n"; }
в main.cpp создаешь объект и пользуешься:
Код
#include "Person.h"
int main(){ Person Vasya; Vasya.name = "Vasya"; Vasya.Shout(); return 0; }
Если хочешь чтобы объекты тебе "создавал другой файл", то тебе нужно что-то из следующего: 1) статические переменные - это плохо, не пользуй их 2) статические функции, создающие объекты 3) объекты-фабрики ( ООП, паттерны, нужно читать )
Цитатаberil ()
Во втором файле, который будет статический
Но ведь он ни в одном глазу не статический!
Цитатаberil ()
InitPerson::exemp = new OutChar('A'); InitPerson::exemp.outLetter();
Тут компилятор будет ругаться.
Статический член класса объявляется с использованием ключевого слова static:
Код
class MyClass{ public: static int myStaticInt; };
затем ДО использования статического члена, его нужно проинициализировать ( в .cpp-файле) :
alkemist, если не сложно можешь по-подробнее написать о статических функциях, создающих объекты и объекты-фабрики. Читал статью на хабре, но к сожалению не дошло)
Сообщение отредактировал Nedname - Вторник, 17 Марта 2015, 19:37
О статических функция тебе лучше почитать книги Шилдта, Праты и Страуструпа. ИМХО, это основы. Хабр тебе рано читать, опять же, по моему скромному мнению)) Лучше освой самую-самую базу.
Есть разница между статическими функциями ( это язык С ) и статическими методами, как в примерах выше ( это язык С++ ). Статическая функция - это такая ф-ция, которая видима другим функциям в пределах текущего файла. Статический метод - это метод класса, который можно вызывать не создавая экземпляра такого класса ( см. пример выше ).
Вкратце, фабрика - специальный класс, "производящий" что-либо.
Например:
Код
#include <vector>
class Product { // его производим public: Product(){ data = 0; } Product( const int data ) { this->data = data; }
public: int data; };
class Factory{ // тут производим и храним public: Factory(){ storage.reserve( 50 ); // резервируем место под 50 указателей на новые Product }
~Factory(){ // деструктор, при уничтожении высвобождает всю занятую память for ( Product* p : storage ) delete p; storage.clear(); }
Product* Create( const int data ) { Product* p = new Product( data ); storage.push_back( p ); return p; }
public: std::vector< Product* > storage; // хранилище созданных объектов
};
У примера выше есть недостатки, но это в общих чертах. Но опять же, если ты не знаешь что такое статические функции ( читай - статические методы ), тебе всё это пока что рановато пробовать. Do what u like.
Сообщение отредактировал alkemist - Среда, 18 Марта 2015, 23:07
Можно ли создать класс в одном файле, создать объект класса в другом, а использовать объект в третьем?
Да
ЦитатаNedname ()
Если да, то как?
Переведу немного. Создать класс в одном файле: описываешь класс в одном файле с помощью ключевого слова class. Создать объект класса в другом: объявляешь переменную типа класса, который описал в предыдущем файле. При этом в текущем файле ты должен подключить предыдущий с директивой include либо описать класс вручную (возможно дублирование кода). Использовать объект в третьем: для этого надо подключить файл с помощью директивы include, в котором объявлена переменная типа того класса. Правильней, конечно, будет, как описал alkemist с объявлением объекта непосредственно в той области, где будет использоваться сам объект, а описание и реализацию методов класса отдельными файлами. Но... если необходим именно заданный вариант, то можно, опять же, воспользоваться принципами раздельной компиляции: file1.cpp - содержит описание класса и его реализацию. file2.cpp - содержит предопределение класса (заголовок). Желательно разделить file1.cpp с "созданием класса" на два файла - один содержит описание, другой - реализацию методов. По заданным условиям придётся обойтись без подключения файла file3.cpp - т.к. объект создан в file2.cpp, то надо объявить его ещё раз, но со спецификатором extern, чтобы указать, что данный объект уже создан, но в другом месте. Компоновщику надо будет скормить все эти файлы, чтобы избежать ошибок.
Цитатаshizofren ()
может не объект, а экземпляр?
Лол. Объект, по определению, и есть экземпляр. Если дословно: объект - это экземпляр класса.
Цитатаalkemist ()
статические переменные - это плохо, не пользуй их
Лол.
Повторюсь, правильно сказал alkemist в посте #9 - используй правильное разделение описаний и объявлений. Если хочешь использовать объект, объявленный в другом файле, который потенциально будет скомпилирован в иной объектный файл, то тебе придётся объявить этот объект ещё раз, но со спецификатором extern. Такие случаи допустимы при использовании глобальных переменных, но желательно избегать этого и объявлять все переменные непосредственно в местах использования. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Четверг, 19 Марта 2015, 22:47
статические переменные - это плохо, не пользуй их Лол.
Сам же потом и ответил, почему это плохо, когда писал о scope. extern ( анахронизм из C ??? ), множественные static и великий и ужасный паттерн singleton - признаки дурно пахнущего кода ( дизайна ). человек должен абсолютно точно знать, что он делает, что вряд ли применимо к ТС ( сам писал - новичек совсем ).
Цитатаfroex ()
. Но... если необходим именно заданный вариант, то можно, опять же, воспользоваться принципами раздельной компиляции: file1.cpp - содержит описание класса и его реализацию. file2.cpp - содержит предопределение класса (заголовок). Желательно разделить file1.cpp с "созданием класса" на два файла - один содержит описание, другой - реализацию методов. По заданным условиям придётся обойтись без подключения файла file3.cpp - т.к. объект создан в file2.cpp, то надо объявить его ещё раз, но со спецификатором extern, чтобы указать, что данный объект уже создан, но в другом месте. Компоновщику надо будет скормить все эти файлы, чтобы избежать ошибок.
в каких ситуациях жизненно необходим и единственно возможен данный вариант? мне кажется, что количество таких задач стремится к нулю. так что лучше изначально продумать архитектуру классов и data flow в них.
P.S. singleton применим в больших командах/проектах, когда ты хочешь быть абсолютно уверен, что студент Вася, не знающий архитектуры проекта, не создаст больше 1 экземпляра важной подсистемы. Do what u like.
Это далеко не анахроизм из Си. Человек спросил решение его задачи, я предложил один из вариантов. Также мы все предложили варианты лучше. Что именно подойдёт как решение, автор топика сам выберет наилучший ему вариант.
Цитатаalkemist ()
в каких ситуациях жизненно необходим и единственно возможен данный вариант? мне кажется, что количество таких задач стремится к нулю. так что лучше изначально продумать архитектуру классов и data flow в них.
Согласен, просто, опять же - предложил вариант решения для той постановки задачи, что просили (а там уже была неудачная архитектура).
Цитатаalkemist ()
singleton применим в больших командах/проектах, когда ты хочешь быть абсолютно уверен, что студент Вася, не знающий архитектуры проекта, не создаст больше 1 экземпляра важной подсистемы.
Синглтон - это синглтон. Это не панацея от глобальных переменных и не является их заменой, даже частичной. Ведь зачастую могут понадобиться глобальные переменные тех типов, которые могут иметь и несколько экземпляров. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Пятница, 20 Марта 2015, 23:54