Результаты поиска
| |
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.
|
|
| |
|