Среда, 06 Декабря 2023, 14:06

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Классы и объекты
Классы и объекты
NednameДата: Понедельник, 16 Марта 2015, 16:50 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет! Ответьте пожалуйста на вопрос. Можно ли создать класс в одном файле, создать объект класса в другом, а использовать объект в третьем? Если да, то как?
Немного поясню:
Есть файл person.h - там класс Person
Есть файл create_person.h или .cpp - там создаются объект класса Person. Person Vasya.
Есть файл main.cpp - там нужно использовать объект Vasya.
Можно ли так сделать. Пробовал создать класс и объект в одном заголовочном файле - main.cpp видит класс, но не видит объект.
berilДата: Понедельник, 16 Марта 2015, 17:54 | Сообщение # 2
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Я не знаю правильно ли понял, что то вроде этого?
Код

  class Person
     {
         public int i = 0;
     }

  class Vasya
     {
       public Person person = new Person();
     }

  class Program
     {
         static void Main(string[] args)
         {
             Vasya vasya = new Vasya();
             vasya.person.i = 2;
         }
     }




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
choopieДата: Понедельник, 16 Марта 2015, 18:31 | Сообщение # 3
частый гость
Сейчас нет на сайте
Цитата beril ()
Я не знаю правильно ли понял, что то вроде этого?

Это жи не С++, это Java.


Сообщение отредактировал choopie - Понедельник, 16 Марта 2015, 18:32
NednameДата: Понедельник, 16 Марта 2015, 18:44 | Сообщение # 4
был не раз
Сейчас нет на сайте
Нет, beril. И я на C++ пишу) Попытаюсь объяснить по другому:

person.h

create_person.h

main.cpp
shizofrenДата: Понедельник, 16 Марта 2015, 18:53 | Сообщение # 5
Starting MS-DOS...
Сейчас нет на сайте
Nedname, может не объект, а экземпляр?

Моя команда
NednameДата: Понедельник, 16 Марта 2015, 19:07 | Сообщение # 6
был не раз
Сейчас нет на сайте
Цитата shizofren ()
может не объект, а экземпляр?

Может и так. Я еще новичок.
berilДата: Понедельник, 16 Марта 2015, 19:15 | Сообщение # 7
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата choopie ()
Это жи не С++, это Java.

это C#. Я просто не совсем понял из првого поста, что автор хотел.
Надо было сразу свой пример показать




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
shizofrenДата: Вторник, 17 Марта 2015, 01:05 | Сообщение # 8
Starting MS-DOS...
Сейчас нет на сайте
Цитата Nedname ()
Может и так. Я еще новичок.

Можно, но обо всем по порядку. Прочитайте уроки по ООП.
Как конкретно реализовать то, что вы спросили -- просто. В первом файле описываете класс:

person.h
Код

#include<iostream>
using namespace std;

class OutChar
{
public:
      OutString(char letter)
      {
          outingLetter = letter;
      }
      void OutLetter()
      {
          cout << letter;
      }
private:
      char outingLetter;
}


Во втором файле, который будет статический, объявляем экземпляр первого класса:
create_person.h
Код

#include "person.h"
class InitPerson
{
public:
     static OutChar exemp;
}


В третьем файле пользуемся экземпляром, который объявили во втором:
main.cpp
Код

#include "create_person.h"
int main()
{
      OutChar InitPerson::exemp = new OutChar('A');
      InitPerson::exemp.outLetter();
      return 0;
}


Моя команда

Сообщение отредактировал shizofren - Вторник, 17 Марта 2015, 10:59
alkemistДата: Вторник, 17 Марта 2015, 02:42 | Сообщение # 9
был не раз
Сейчас нет на сайте
Цитата Nedname ()
Можно ли создать класс в одном файле, создать объект класса в другом, а использовать объект в третьем? Если да, то как?
Немного поясню:
Есть файл person.h - там класс Person
Есть файл create_person.h или .cpp - там создаются объект класса Person. Person Vasya.
Есть файл main.cpp - там нужно использовать объект Vasya.
Можно ли так сделать. Пробовал создать класс и объект в одном заголовочном файле - main.cpp видит класс, но не видит объект.


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

Лучше делать так - в Person.h описываешь класс:

Код

#ifndef PERSON_H_
#define PERSON_H_
#include <string>

class Person{
    public:
        Person();
        ~Person();
         
        void Shout();

    public:
        int age;
        int weight;
        std::string name;
};

#endif


В Person.cpp определяешь методы:

Код

#include "Person.h"

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-файле) :

Код

int MyClass::myStaticInt = 0;


а потом уже пользоваться.


Do what u like.
shizofrenДата: Вторник, 17 Марта 2015, 10:58 | Сообщение # 10
Starting MS-DOS...
Сейчас нет на сайте
Цитата alkemist ()
Статический член класса объявляется с использованием ключевого слова static:

Точно, забыл. Уже поправил, спасибо.


Моя команда
NednameДата: Вторник, 17 Марта 2015, 19:22 | Сообщение # 11
был не раз
Сейчас нет на сайте
alkemist, если не сложно можешь по-подробнее написать о статических функциях, создающих объекты и объекты-фабрики. Читал статью на хабре, но к сожалению не дошло)

Сообщение отредактировал Nedname - Вторник, 17 Марта 2015, 19:37
alkemistДата: Среда, 18 Марта 2015, 22:59 | Сообщение # 12
был не раз
Сейчас нет на сайте
Nedname,

О статических функция тебе лучше почитать книги Шилдта, Праты и Страуструпа. ИМХО, это основы.
Хабр тебе рано читать, опять же, по моему скромному мнению)) Лучше освой самую-самую базу.

Есть разница между статическими функциями ( это язык С ) и статическими методами, как в примерах выше ( это язык С++ ).
Статическая функция - это такая ф-ция, которая видима другим функциям в пределах текущего файла.
Статический метод - это метод класса, который можно вызывать не создавая экземпляра такого класса ( см. пример выше ).

Вкратце, фабрика - специальный класс, "производящий" что-либо.

Например:

Код

#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
froexДата: Четверг, 19 Марта 2015, 22:46 | Сообщение # 13
Руководитель Froexilize team
Сейчас нет на сайте
Цитата Nedname ()
Можно ли создать класс в одном файле, создать объект класса в другом, а использовать объект в третьем?

Да
Цитата 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
alkemistДата: Пятница, 20 Марта 2015, 15:50 | Сообщение # 14
был не раз
Сейчас нет на сайте
Цитата froex ()
статические переменные - это плохо, не пользуй их
Лол.

Сам же потом и ответил, почему это плохо, когда писал о 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.
froexДата: Пятница, 20 Марта 2015, 23:54 | Сообщение # 15
Руководитель Froexilize team
Сейчас нет на сайте
Цитата alkemist ()
extern ( анахронизм из C ??? )

Это далеко не анахроизм из Си. Человек спросил решение его задачи, я предложил один из вариантов. Также мы все предложили варианты лучше. Что именно подойдёт как решение, автор топика сам выберет наилучший ему вариант.
Цитата alkemist ()
в каких ситуациях жизненно необходим и единственно возможен данный вариант? мне кажется, что количество таких задач стремится к нулю. так что лучше изначально продумать архитектуру классов и data flow в них.

Согласен, просто, опять же - предложил вариант решения для той постановки задачи, что просили (а там уже была неудачная архитектура).
Цитата alkemist ()
singleton применим в больших командах/проектах, когда ты хочешь быть абсолютно уверен, что студент Вася, не знающий архитектуры проекта, не создаст больше 1 экземпляра важной подсистемы.

Синглтон - это синглтон. Это не панацея от глобальных переменных и не является их заменой, даже частичной. Ведь зачастую могут понадобиться глобальные переменные тех типов, которые могут иметь и несколько экземпляров.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Пятница, 20 Марта 2015, 23:54
Форум игроделов » Программирование » C/C++ » Классы и объекты
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2023 Рейтинг