Хранить нестатический объект в классе со статическими функциями

i have two classes (non-static) A & (static) B. I am trying to store Object A into B so that i can use its functions in funcB(). However i do know that static classes cannot store non-static variables & functions. is there anyway to get pass this rather than converting Class A into a static class?

class A
{
   public:
          A();
          void funcA();
   private:
          int A;
};

class B
{
   public:
         B(A *objA);
         static void funcB();
   private:
         A *objA;
};

редактировать: Я сказал статический класс, чтобы упростить объяснение. Я не знал правильного термина. Поэтому на самом деле возникает вопрос: как использовать нестатический элемент из статической функции?

0
nl ja de
«Статических классов» не существует, и ваш вопрос не имеет смысла. Пожалуйста, объясните, почему вы считаете, что вам это нужно.
добавлено автор Lightness Races in Orbit, источник
Нет такой вещи, как «статический класс». Может быть, вы имеете в виду одноэлементный класс, который концептуально имеет только статические члены. Кроме того, экземпляры вашего «статического класса» могут иметь нестатические элементы. Только эти статические методы не могут использовать эти нестатические элементы, поскольку им нужен экземпляр для их использования.
добавлено автор Mark Garcia, источник
@null, Как это будет работать? Статические элементы можно использовать/вызывать без экземпляра. Какие нестатические члены этого экземпляра вы предлагаете использовать?
добавлено автор chris, источник
@null, статические члены не могут получить доступ к нестационарным членам, потому что статические члены могут использоваться без создания объекта в первую очередь. Каждый объект имеет свой собственный набор нестатических элементов. Как узнать, какой набор нестатических членов использовать, если он может получить доступ к нестационарным членам?
добавлено автор chris, источник
@null, может быть, вам нужен статический A * objA ?
добавлено автор billz, источник
Почему бы не передать указатель или ссылку A на funcB?
добавлено автор pippin1289, источник
Извините, что я сказал статические классы, поскольку это было легче объяснить. Я знаю, что они не существуют в c ++. но статические функции. Однако при объявлении статических функций я не могу использовать указатель * objA. Мне нужно это, потому что класс A связывается со многими другими классами и хранит много другой информации. Класс B, с другой стороны, должен быть статичным из-за некоторого состояния потоковой обработки Windows API.
добавлено автор mister, источник
@MarkGarcia, как вы объявляете экземпляр таким образом, чтобы статические методы могли использовать нестатические элементы?
добавлено автор mister, источник
@chris извините, но я не понимаю, что вы подразумеваете под тем, что я предлагаю использовать?
добавлено автор mister, источник

2 ответы

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

Ниже приведен пример использования

    #include 

using namespace std;

class A
{
   public:
    A(int value) : a(value){}
          void funcA();
   public:
          int a;
};

class B
{
   public:
         B()
         {
             objA = new A(12);
         }

         void funcB2()
         {
             B::funcB(*objA);
         }

         static void funcB(A const & value)
         {
            cout << "Hello World! " << value.a << endl;
         }

   private:
         A *objA;
};

int main()
{
    A a(10);
    B::funcB(a);

    B b;
    b.funcB2();
    return 0;
}
1
добавлено

Я думаю, вы просто не должны делать такой дизайн. Статическая функция инициализируется, когда нестатические элементы не готовы. Вы сказали, что «класс A связан со многими другими классами и хранит много другой информации. Класс B, с другой стороны, должен быть статичным из-за некоторого состояния потоковой обработки Windows API». , В этом случае вы можете изменить свой дизайн и превратить A в статический класс?

0
добавлено
если я превращу A в статический класс, тогда будет затронуто множество других классов. это будет проблемой. Я фактически использую Windows FileSystemWatcher, который требует статических методов. :(
добавлено автор mister, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest