Я должен перенести весь свой код C++ в его собственное пространство имен?

Чтобы получить данные автозаполнения, выполните следующие действия.

Пр. index.jsp

<!DOCTYPE html>
<html lang="en">    
<head>
<meta charset="UTF-8">
<title>Airport Autocomplete</title>    
<link rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css">    
<link rel="stylesheet" href="css/style.css"> 
</head>
<body>
    <div class="form-group">
        <label class="control-label">Enter an Airport</label> <input
            id="autocomplete" class="autocomplete" type="text" />
    </div>
    <div class="form-group">
        <label class="control-label">Enter something else</label> <input
            id="autocomplete2" class="autocomplete" type="text" />
    </div>
    <div class="form-group">
        <label class="control-label">Another field (so we can test TAB
            behavior)</label> <input type="text" />
    </div>
    <script
        src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.1/lodash.min.js'></script>
    <script
        src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js'></script>
    <script src='https://unpkg.com/fuse.js@2.5.0/src/fuse.min.js'></script>
    <script
        src='https://screenfeedcontent.blob.core.windows.net/html/airports.js'></script>

css / style.css

body {
  margin: 50px;
}

.form-group {
  margin-bottom: 20px;
}

.control-label {
  display: block;
}

.autocomplete-wrapper {
  position: relative;
}
.autocomplete-wrapper input {
  width: 100%;
}

.autocomplete-results {
  position: absolute;
  background: white;
  z-index: 1;
  top: 100%;
  left: 0;
  font-size: 13px;
  border: solid 1px #ddd;
  border-top-width: 0;
  border-bottom-color: #ccc;
  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
}

.autocomplete-result {
  padding: 12px 15px;
  border-bottom: solid 1px #eee;
  cursor: pointer;
}

.autocomplete-result:last-child {
  border-bottom-width: 0;
}

.autocomplete-location {
  opacity: .8;
  font-size: smaller;
}

.autocomplete-results[data-highlight='0'] > :nth-child(1) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

.autocomplete-results[data-highlight='1'] > :nth-child(2) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

.autocomplete-results[data-highlight='2'] > :nth-child(3) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

.autocomplete-results[data-highlight='3'] > :nth-child(4) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

.autocomplete-results[data-highlight='4'] > :nth-child(5) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

.autocomplete-results[data-highlight='5'] > :nth-child(6) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

.autocomplete-results[data-highlight='6'] > :nth-child(7) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

.autocomplete-results[data-highlight='7'] > :nth-child(8) {
  color: white;
  background: #26C9FF;
  border-bottom-color: #26C9FF;
  outline: solid 1px #00b6f2;
}

js / index.js

var options = {
  shouldSort: true,
  threshold: 0.4,
  maxPatternLength: 32,
  keys: [{
    name: 'iata',
    weight: 0.5
  }, {
    name: 'name',
    weight: 0.3
  }, {
    name: 'city',
    weight: 0.2
  }]
};

var fuse = new Fuse(airports, options)

$('.autocomplete').each(function() {
  var ac = $(this);

   ac.on('click', function(e) {
    e.stopPropagation();
  })
  .on('focus keyup', search)
  .on('keydown', onKeyDown);

  var wrap = $('<div>')
    .addClass('autocomplete-wrapper')
    .insertBefore(ac)
    .append(ac);

    var list = $('<div>')
      .addClass('autocomplete-results')
      .on('click', '.autocomplete-result', function(e) {
        e.preventDefault();
        e.stopPropagation();
        selectIndex($(this).data('index'), ac);
    })
    .appendTo(wrap);
});

$(document)
  .on('mouseover', '.autocomplete-result', function(e) {
    var index = parseInt($(this).data('index'), 10);
    if (!isNaN(index)) {
      $(this).attr('data-highlight', index);
    }
  })
  .on('click', clearResults);

function clearResults() {
  results = [];
  numResults = 0;
  $('.autocomplete-results').empty();
}

function selectIndex(index, autoinput) {
  if (results.length >= index + 1) {
    autoinput.val(results[index].iata);
    clearResults();
  }  
}

var results = [];
var numResults = 0;
var selectedIndex = -1;

function search(e) {
  if (e.which === 38 || e.which === 13 || e.which === 40) {
    return;
  }
  var ac = $(e.target);
  var list = ac.next();
  if (ac.val().length > 0) {
    results = _.take(fuse.search(ac.val()), 7);
    numResults = results.length;

    var divs = results.map(function(r, i) {
        return '<div class="autocomplete-result" data-index="'+ i +'">'
             + '<div><b>'+ r.iata +'</b> - '+ r.name +'</div>'
             + '<div class="autocomplete-location">'+ r.city +', '+ r.country +'</div>'
             + '</div>';
     });

    selectedIndex = -1;
    list.html(divs.join(''))
      .attr('data-highlight', selectedIndex);

  } else {
    numResults = 0;
    list.empty();
  }
}

function onKeyDown(e) {
  var ac = $(e.currentTarget);
  var list = ac.next();
  switch(e.which) {
    case 38: // up
      selectedIndex--;
      if (selectedIndex <= -1) {
        selectedIndex = -1;
      }
      list.attr('data-highlight', selectedIndex);
      break;
    case 13: // enter
      selectIndex(selectedIndex, ac);
      break;
    case 9: // enter
      selectIndex(selectedIndex, ac);
      e.stopPropagation();
      return;
    case 40: // down
      selectedIndex++;
      if (selectedIndex >= numResults) {
        selectedIndex = numResults-1;
      }
      list.attr('data-highlight', selectedIndex);
      break;

    default: return; // exit this handler for other keys
  }
  e.stopPropagation();
  e.preventDefault(); // prevent the default action (scroll / move caret)
}
26
задан NTDLS 15 January 2010 в 15:41
поделиться

8 ответов

Многие разработчики C++ не используют пространства имен, печально. Когда я запустил с C++, я не использовал их в течение долгого времени, пока я не пришел к выводу, что могу сделать лучшие пространства имен использования.

библиотеки Many работают вокруг пространств имен путем помещения префиксов перед именами. Например, wxWidgets помещает символы "wx" перед всем. QT помещает "Q" перед всем. Это - ничто действительно неправильно с этим, но это требует, чтобы Вы ввели тот префикс снова и снова, даже при том, что, когда это может быть выведено из контекста, какие объявления Вы имеете в виду. Пространства имен имеют иерархический порядок. Имена, которые лексически ближе до такой степени, что ссылка их найдена ранее. Таким образом, при ссылке на "Окно" в платформе GUI оно найдет "мой:: gui:: Окно", вместо ":: Окно".

Пространства имен активируют некоторые хорошие функции, которые не могут быть использованы без них. Например, при помещении класса в пространство имен можно определить бесплатные функции в том пространстве имен. Вы затем звоните, вызывают функцию, не помещая пространство имен впереди путем импорта всех имен, или выборочно только некоторые из них в текущую область ("использующий объявление").

В наше время, я больше не делаю никакого проекта, не используя их. Они делают так легким не ввести тот же префикс снова и снова, но все еще иметь хорошую организацию и предотвращение загрязнения имени глобального пространства имен.

35
ответ дан Johannes Schaub - litb 28 November 2019 в 06:51
поделиться

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

И так как пространства имен не требуются, фрагменты кода и примеры в сети редко используют их, но самые реальные проекты действительно используют их.

11
ответ дан Robert Gould 28 November 2019 в 06:51
поделиться

Это действительно зависит от того, ожидаете ли Вы там быть какими-либо конфликтами.

Два сценария;

1) при создании кода, который может использоваться другими (например, библиотеки) затем, могли быть столкновения пространства имен, настолько использующие собственное пространство имен, хорошая идея.

2), Если Вы пользуетесь сторонними библиотеками, их код не может быть namespaced и мог бы конфликтовать с Вашим.

я также сказал бы, что, если Вы ожидаете, Ваш код, чтобы быть значительным и покрыть много различных областей (математика/физика/рендеринг) затем с помощью пространств имен действительно делает код легче к grok, особенно для типов, которые, очевидно, не классифицированы.

2
ответ дан Andrew Grant 28 November 2019 в 06:51
поделиться

У нас были проблемы при обертывании кода в управляемый С++, который пользуется нашими общими библиотеками здесь.

Некоторые классы имели те же имена как Системный класс в библиотеке.NET (т.е. Система. Консоль).
Мы должны были сделать некоторые ужасные макро-патчи к обходному решению эти проблемы.

Используя пространства имен вначале предотвратил бы это.

2
ответ дан jturcotte 28 November 2019 в 06:51
поделиться

Вам только действительно нужны пространства имен, если существует риск конфликта имен - некоторая глобально замеченная функция или переменная или класс определяются несколько раз. Иначе Вы сделаете очень хорошо без пространства имен - просто называют Ваши классы так, чтобы они не копировали классы библиотеки времени выполнения и делали глобальные функции/переменную, чтобы быть статическими членами некоторых разумных классов.

1
ответ дан sharptooth 28 November 2019 в 06:51
поделиться

, но эта практика, кажется, является редким в мире C++

Действительно. Весь код, который я вижу, кажется, перенесен в пространство имен.
я использую тот же тип конвенции, которую я вижу в Java (кроме, я отбрасываю com).

В Java

package com.<Company>.<Product>.<Package>;

В C++

namespace <Company>
{
     namespace <Product>
     {
         namespace <Package>
         {
         }
     }
 }
1
ответ дан xyz 28 November 2019 в 06:51
поделиться

Я только что обнаружил руководство по стилю Google c ++, и у него есть правила пространства имен.

Все руководство целиком. стоит прочитать, но вкратце они говорят:

  • Добавляйте безымянные пространства имен к файлам .cc, но не файлам .h.
  • Переносите целые (после включения / объявления) файлы .cc и .h в именованные пространства имен.
  • Пространства имен не увеличивают уровень отступа.
  • В закрывающей скобке для пространства имен напишите } // пространство имен .
  • Ничего не объявляйте в std , поскольку он не определен.
  • использование директивы using запрещено.
  • объявление using разрешено в функциях, методах и классах. Допускаются псевдонимы пространств имен
  • где угодно.
4
ответ дан 28 November 2019 в 06:51
поделиться

Я бы сказал, что это хорошая идея, хотя бы по той причине, что на ваши вещи не наступят, когда они смешаны с другим сторонним кодом.

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

1
ответ дан 28 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: