Правильное использование статических членов класса - PullRequest
0 голосов
/ 08 апреля 2011

Как правильно иметь статические члены класса?

Я пытаюсь создать класс метрик, чтобы я мог включить «metrics.h» во все мои файлы и использовать определенные переменные из него (статические), чтобы отслеживать информацию о синхронизации между несколькими отдельно скомпилированными библиотеками.

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

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

Metrics :: startTime = ....

и Metrics :: calcTime = ....

в общей библиотеке или в одной из других библиотек, которые ссылаются на общую

Ответы [ 5 ]

2 голосов
/ 08 апреля 2011

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

Даже лучше, чем непосредственное создание экземпляра и доступ к этому статическому члену, он скрывает его внутри функции получения.

class metrics {
    ...
    struct measurements { // struct may be private; you can still access
        double startTime; // the members of the result of the getter fn.
        double calcTime;
        ...
    };

public:
    static measurements &getMeasurements() {
        static measurements instance;
        return instance;
    }
};

При этом вам не нужно ничего добавлять в файл .cpp. measurements объект instance создается при первом вызове getMeasurements, и тот же объект возвращается для всех последующих вызовов.

1 голос
/ 08 апреля 2011
// metrics.hpp
class metrics {
static int i; // declaration
};

// metrics.cpp
int metrics::i(0); // definition

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

1 голос
/ 08 апреля 2011

Не следует объединять библиотеки таким образом, чтобы один и тот же код заканчивался связыванием с программой более одного раза. Изолируйте свой класс метрик в одной библиотеке вместе с другими классами, в которые он должен быть упакован (см. Руководство по шести принципам упаковки, опубликованным Robert Martin ). Поместите ваши другие классы, которые зависят от него, в другие библиотеки (или поместите все это в одну библиотеку, если эти принципы упаковки показывают, что они принадлежат друг другу). При связывании программы делайте ссылки на все необходимые библиотеки, включая библиотеки, которые зависят от класса метрик, и (одну) библиотеку, которая содержит класс метрик.

1 голос
/ 08 апреля 2011

В заголовочном файле:

class Metrics {
  public:
  static int startTime ;
  } ;

В ровно один cpp файл:

int Metrics::startTime ;
0 голосов
/ 08 апреля 2011

Metrics.h

#ifndef _METRICS_H
#define _METRICS_H

class Metrics {
    ...
    public:
        Metrics();
        //declare the static variables in the header for the class
        static int startTime;
        static int calcTime;
}

#endif

Metrics.cpp

#include "Metrics.h"

Metrics::Metrics(){
    ...
}

//define and initialize the variables in the implementation of the class
int Metrics::startTime = 15;
int Metrics::calcTime = 20;

main.cpp

#include "Metrics.h"

int main(){
    //use the static variables elsewhere
    int a = Metrics::startTime;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...