Пятница, 22 Ноября 2024, 20:17

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Результаты поиска
alkemistДата: Пятница, 20 Марта 2015, 15:50 | Сообщение # 1 | Тема: Классы и объекты
был не раз
Сейчас нет на сайте
Цитата 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.
alkemistДата: Среда, 18 Марта 2015, 22:59 | Сообщение # 2 | Тема: Классы и объекты
был не раз
Сейчас нет на сайте
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
alkemistДата: Среда, 18 Марта 2015, 12:51 | Сообщение # 3 | Тема: Проблема с TinyXML
был не раз
Сейчас нет на сайте
Nedname,
Тебе нужно добавить в свой проект в настройки линковщика пути поиска .dll (.lib, .a )-файлов и добавить в опции линковки tinyxml.lib(.dll, .a).
для mingw/gcc/clang это было бы так: -Lc:\mylibs\tinyxml -ltinyxml

P.S.
Если у тебя компилятор от мелкософта, то тебе нужно подсунуть ему пути к .lib-файлам, а .dll он должен найти сам ( если я не ошибаюсь, давно на винде не работал ).


Do what u like.

Сообщение отредактировал alkemist - Среда, 18 Марта 2015, 12:52
alkemistДата: Вторник, 17 Марта 2015, 18:05 | Сообщение # 4 | Тема: *помощь больше не нужна*
был не раз
Сейчас нет на сайте
он всё сделал сам ))

Do what u like.
alkemistДата: Вторник, 17 Марта 2015, 02:42 | Сообщение # 5 | Тема: Классы и объекты
был не раз
Сейчас нет на сайте
Цитата 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.
  • Страница 1 из 1
  • 1
Поиск:

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