У нас есть классы A, B и C, всем из которых требуется доступ к статической переменной staticVariable в классе D.

Более того, у класса A должен быть экземпляр классов B и C, например:

    class A{
    public:
    B instanceB;
    C instanceC;
    };

Класс D содержит статическую переменную типа объекта T:

    class D{
    public:
    D() {
    staticVariable.init();
    };
    static T staticVariable;
    };

В примере классы B и C могут быть пустыми классами-заполнителями:

    class B{
    };

    class C{
    };

Основная функция создает экземпляр A:

    int main(){
    A a;
    /*...*/
    }

Опять же, классам A, B и C нужен доступ к staticVariable. Я пробовал несколько подходов, включая наследование и функции друзей, однако у меня всегда возникают проблемы с зависимостями или ошибки компоновщика, которые я не совсем понимаю:

    Error   LNK2001 unresolved external symbol "public: static class T 
    D::staticVariable" (?window@D@@2VT@sf@@A)   SortingAlgorithms    
    C:\Users\Dusan\source\repos\SortingAlgorithms\SortingAlgorithms\B.obj       

Сообщается в файлах .obj классов A, B и C.

Я не уверен, нужен ли мне экземпляр D в main? Как мне реализовать это без ошибок?

1
yomag1234 16 Фев 2021 в 16:10

2 ответа

Лучший ответ

Переменные static глобальные, их нужно инициализировать вне класса, например:

class B{};

class C{};

class A{
public:
    B instanceB;
    C instanceC;
};

class D{
public:
    D(){};
    static int staticVariable;
};

int D::staticVariable = 10; //<-- here, outside the class

int main()
{
    std::cout << D::staticVariable; // prints 10
    D::staticVariable++;
    std::cout << D::staticVariable; // prints 11 
}

А как это сделать для статических объектов, вызывающих функцию для инициализации?

По тому же принципу вы объявляете объект статическим внутри класса и инициализируете его снаружи:

class A{
public:
    void doSomething(){std::cout << "Do Something";}
};

class D{
public:
    static A obj; //declare
};

A D::obj{};  //<-- initialize outside the class

int main()
{
    D::obj.doSomething();  // prints 'Do Something'
}
3
anastaciu 16 Фев 2021 в 13:58
// in D.hpp
class D {
public:
  D() { ... }; // staticVariable is static, so the ctor has no business initializing it
  static int staticVariable;
};

// in D.cpp
#include "D.hpp"

int D::staticVariable = 10;
2
m88 16 Фев 2021 в 13:26
66224970