proudmore
@proudmore

Где и в каких случаях правильно использовать extern?

Собственно, сабж.
Вопрос возник из ситуации. Есть класс, в методах которого используется экземпляр другого класса. В каждом методе я создавал этот экземпляр.
  • Вопрос задан
  • 500 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Назначение extern единственное. Мы говорим, что этой переменной нет в данной единице компиляции, но не надо переживать, она есть в другой и компоновщик её подкомпонует.

По факту является extern’ом static-поле класса. Это решение принято Строуструпом по простой причине: определение класса может промелькнуть несколько раз в разных единицах компиляции, а определение переменной должно быть одно на программу.

Если ваш код не работает без extern — это значит, что где-то нашлась глобальная переменная по имени client, и для корректной работы вебмастера потребовалось обращаться к этому нашему клиенту. По факту — очень навороченный способ создать static-поле.

Таким образом, у вас три варианта.

1. Если Ethernet-клиент один на всех вебмастеров, вам нужно static-поле.
// HEADER
class WebMaster {
public:
    WebMaster();
    bool connect_open();
private:
    static EthernetClient client;
}

// CPP
EthernetClient WebMaster::client;


Впрочем, этот вариант крайне маловероятен.

2. Скорее всего, у вас один вебмастер — один клиент и, вероятно, вам нужно обычное нестатическое поле.
class WebMaster {
public:
    WebMaster();
    bool connect_open();
private:
    EthernetClient client;
}


3. Если у нас приходится привязывать мастеров к клиентам, приходится использовать указатели и ссылки. В простейшем виде…
// HEADER
class WebMaster {
public:
    WebMaster(EthernetClient& aClient);
    bool connect_open();
private:
    EthernetClient& client;
}

// CPP
WebMaster::WebMaster(EthernetClient& aClient) : client(aClient) {}

...
EthernetClient client;
WebMaster webmaster(client);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@sitev_ru
sitev.ru - мой блог ...
class WebMaster {
public:
    EthernetClient client;
    WebMaster();
}

WebMaster::WebMaster() {
}

bool WebMaster::connect_open() {
    byte addr[4]= {xx,xx,xx,xx};
    if (client.connect(addr, 80)) {
      return true;
    }
    else{
      return false;
    }
}
Ответ написан
Комментировать
@mamkaololosha
Странное решение. Почему не создать экземпляр класса внутри? Или отнаследоваться от него?
Или
EthernetClient client;
WebMaster master1;
WebMaster master2;
master1.setClient(client);
master2.setClient(client);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы