Неопределенная ссылка на статическую переменную-член исправлена ​​добавлением 0 - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь понять следующую ошибку, которую g ++ выдавал при попытке связать мой код. Обсуждаемая ошибка компоновки:

ClassA.cpp:17: undefined reference to `ClassA::xOffset'
ClassA.cpp:17: undefined reference to `ClassA::yOffset'

Эта ошибка происходит из этой строки

ClassA::ClassA(int width, int height) : m_width(width - 2 * xOffset), 
                                        m_height(height - 2 * yOffset),
                   ---> error here      m_classB(50, 300,std::make_tuple(xOffset + m_width, xOffset), std::make_tuple(yOffset + m_height, yOffset))

Ошибка, в частности, связана с созданием кортежей и ссылкой на xOffset и yOffset ввторая запись в каждом вызове make_tuple.

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

class ClassA {
    public:
        ClassA(int width, int height);
        .....

    private:
        static const int xOffset = 150;
        static const int yOffset = 300;

        int m_width;
        int m_height;

        ClassB m_classB;
        ....
};

Там, где инициализируются и xOffset, и yOffset.

Как ни странно, после игры с ошибкой я могу устранить ошибку компоновки, изменив строку инициализации на эту

ClassA::ClassA(int width, int height) : m_width(width - 2 * xOffset), 
                                        m_height(height - 2 * yOffset),
                                        m_classB(50, 300,std::make_tuple(xOffset + m_width, xOffset + 0), std::make_tuple(yOffset + m_height, yOffset + 0))

Где единственное изменение - это добавление 0 к xOffset и yOffset. Это устраняет ошибку компоновки и позволяет мне компилировать и запускать мой код.

Мой вопрос заключается в том, почему добавление + 0 исправляет ошибку компоновки и почему я могу ссылаться на статические переменные xOffset и yOffset в списке инициализации, когдасоздание m_width и m_height, но повторение этого в следующем элементе списка инициализации вызывает ошибку компоновщика?

1 Ответ

0 голосов
/ 02 ноября 2019

Я думаю, что ваш cpp-файл нужно добавить:

const int ClassA::xOffset;
const int ClassA::yOffset;
...