LINUX.ORG.RU

с++ разделить переменные между классами/библиотеками


0

1

Такой немного школовопрос. В первой библиотеке эти переменные читаются из базы данных. Сейчас я заворачиваю их в структуру и передаю в функцию init(struct*) второй библиотеке. init инициализирует static члены второго класса.

Я всё правильно делаю?


int gVar = 0; // lib1.cpp
extern int gVar; // lib1.h

#include <lib1.h> // lib2.cpp
printf(«%d», gVar);
либо
struct init { init() { gVar = 1234; } }; init gInit;
если нужно инициализировать из второй либы - переменную первой. Хотя зачем такой изврат это большой вопрос. Кстати, вопрос вообще поставлен непонятно.
- заворачиваю статические данные в структуру? Это как - struct->gVarPtr = &gVar?
- static члены _второго_ класса? А что за первый класс, про него ни слова?

В общем неплохо бы понятнее сформулировать вопрос.

queen3 ★★★★★
()

init(struct*)
c++

/0

anonymous
()
Ответ на: комментарий от queen3

Согласен, формулировка немного скомкана. В общем, объект первого класса (их крутится много в разных тредах) много получает картинку, проводит небольшой предварительный анализ и по сокету передаёт данные объекту второго класса для окончательного анализа. При этом некоторые параметры никогда не изменяются ни для какого объекта (размеры картинки, например). Поэтому они сделаны статиками.

Про extern я как-то не подумал, это конечно вариант.

float
() автор топика
Ответ на: комментарий от float

При этом некоторые параметры никогда не изменяются ни для какого объекта (размеры картинки, например). Поэтому они сделаны статиками.

Что-то я чую подвох. static означает, что значение поля является общим для всех инстансов класса, а не то, что оно никогда не меняется.

dmfd
()
Ответ на: комментарий от queen3

если нужно инициализировать из второй либы - переменную первой

не совсем. просто нужно как-то добиться, чтобы вторая либа знала значения параметров, которые заданы в первой.

заворачиваю статические данные в структуру? Это как

как-то так:

typedef struct Params {
    size_t height;
    size_t width;
};

Params *p = new Params;
p->height = getFromDB(height);
p->width = getFromDB(width);

Class2 c;
c.init(p);

float
() автор топика
Ответ на: комментарий от dmfd

Ну оно не меняется не только во времени но и в пространстве объектов скажем так.

float
() автор топика
Ответ на: комментарий от float

typedef ненужен. init ненужен, читаем про конструкторы.

P.S. Если ты знаешь с, это не значит, что ты можешь писать с++.

dmfd
()
Ответ на: комментарий от dmfd

читаем про конструкторы

мне кажется, ты не совсем понял вопрос.

float
() автор топика
Ответ на: комментарий от float

При этом некоторые параметры никогда не изменяются ни для какого объекта (размеры картинки, например). Поэтому они сделаны статиками.

Избавься от static-ов, это решит твою проблему.

Manhunt ★★★★★
()
Ответ на: комментарий от JackyTreehorn

Если не обращать внимание на отсутствие С++

а как такое делается в C++?

float
() автор топика
Ответ на: комментарий от Manhunt

Избавься от static-ов, это решит твою проблему.

Каким образом? Если я правильно понимаю, то это добавит проблем, так как придётся передавать значения каждому новому объекту. А статики - инициализировал один раз и забыл про них.

float
() автор топика
Ответ на: комментарий от float

придётся передавать значения каждому новому объекту

Ну и передашь, вместе с остальными инициализационными параметрами этого объекта. Как вариант, можно хранить параметры в фабрике объектов, а экземпляр фабрики будет ассоциирован с сеансом работы с БД.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от Manhunt

Ну и передашь,

дык изначальный вопрос был «нужно ли передавать один раз?», а ты предлагаешь передавать много раз.

Думаю, что extern ближе к тому, что я искал. Мне в принципе и с одноразовой инициализацией хорошо, но подумал, что вдруг есть какой-то стандартный грамотный способ как такое провернуть.

float
() автор топика
Ответ на: комментарий от float

Тут поможет поттеринг «Прототип».

class FatData
{
private:
    FatDataInclude *m_fatfat; // need to copy
public:
    // setters and getters for 10 fields
    // ...
    FatData *clone() const;
};

FatData *FatData::clone() const
{
    auto ret = new FatData(*this);
    ret->m_fatfat = new FatDataInclude(m_fatfat);
    return ret;
}
Или поттеринг «Фабрика»
class FatData;
class FatDataFactory
{
public:
    FatData *create() const;
    /** factory also keeps 10 different parameters and uses them to initialize FatData */
};

quiet_readonly ★★★★
()
Ответ на: комментарий от float

их крутится много в разных тредах
по сокету передаёт данные объекту второго класса для окончательного анализа
некоторые параметры никогда не изменяются
Поэтому они сделаны статиками

жесть, человек не знает языка программирования, но уже использует сокеты и треды
а потом нормальным программистам разгребать этот говнокод
как же задрала школота, которая хочет не учиться, а что-нибудь делать

dt1 ★★
()
Ответ на: комментарий от dt1

Чем они тебя задрали и в какое место?

Если серьезно, то действительно, чем они тебе насолилил? Как-то влияет на твою работу или что?

anonymous
()
Ответ на: комментарий от anonymous

Ну вот подключается такой к твоему проекту. Поначалу думаешь, что все отлично, свежие силы, сейчас что-нибудь полезное сделает.
А потом пошло-поехало. Весь код начинает выглядеть так, как будто штаны через голову надевали.

dt1 ★★
()
Ответ на: комментарий от queen3

extern int gVar;

0_0 Сказано же

c++

зачем такую ересь предлагать?

AlexVR ★★★★★
()
Ответ на: комментарий от dmfd

читаем про конструкторы.

+1. Как минимум обеспечишь порядок создания объектов на архитектурном уровне.

З.Ы. static - на фиг. Лишние заморочки - на фиг. extern - не сходи с ума, полная чушь и уродство для c++

AlexVR ★★★★★
()
Ответ на: комментарий от dt1

а потом нормальным программистам разгребать этот говнокод

Ну я не знаю, как тебе помочь. Учи лисп, делай стартап, это избавит тебя от контакта со школокодом. Но что-то подсказывает мне, что ты не совсем способен на такое, коли тебе доверяют лишь разгребать за школьниками.

хочет не учиться, а что-нибудь делать

Вопрос созрел, потому что было желание научиться делать правильно, не?

Вообще не в моих правилах тратить время на депрессированых зануд вроде тебя, но сейчас же каникулы.

float
() автор топика
Ответ на: комментарий от float

делай стартап

с этим тебе на быдлохабр

ты не совсем способен на такое, коли тебе доверяют лишь разгребать за школьниками

лол, да это мой проект, open source

Вопрос созрел, потому что было желание научиться делать правильно, не?

не, правильно сначала выучить язык хотя бы на базовом уровне

dt1 ★★
()
Ответ на: комментарий от float

Да заменили его более молодыми кадрами, вот и накопилась обида.

если представить, что такое невероятное событие может вообще произойти, то я бы из такой конторы заранее сбежал бы и потом наблюдал бы со стороны как она погребается под грузом криворуких школоло

dt1 ★★
()
Ответ на: комментарий от dt1

лол, да это мой проект, open source

осталось только дать ссылку на него, чтобы будущим поколениям было на что равняться.

float
() автор топика

инициализирует static члены второго класса

Лучшеб параметры заворачивались в класс, объект которого инициализировался запросом из БД. После чего этот объект использовала бы и первая библиотека и вторая через глобальные указатели в своих неймспейсах.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Я как раз на пути к этому решению. Создал синглет Info, состоящий только из переменных, которые нужны обоим классам-«работникам» и функции, считывающей эти переменные из базы, если они ещё не считаны.

float
() автор топика

Слишком сильная связанность между библиотеками.

Лучше избежать прямого взаимодействия.

man «Совершенный код»

unfo ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.