Пространства имен C++ - “использование” или явно указало? [дубликат]

6
задан Community 23 May 2017 в 12:17
поделиться

3 ответа

IE 6 поддерживает только псевдокласс : hover на ссылки, но IE 7 поддерживает его на большинстве элементов.

Как сказал Дэвид, это может не работать в режиме причуд. Тогда причиной будет то, что IE в основном возвращается к чему-то ближе к IE 4 в режиме причуд, позволяя много специфичных для IE функций и удаляя несколько совместимых со стандартами функций.

Если требуется функция : наведение на элемент блока и поддержка обратно в IE 6, можно использовать элемент ссылки и сделать его элементом блока с помощью CSS. Обратите внимание, что ссылка может содержать только встроенные элементы (например, no div s), так что если вы хотите блокировать элементы внутри ссылки, вам придется установить, что с помощью CSS также:

CSS:

.hoverlink { display: block; }
.hoverlink:hover { background: #eee; }
.hoverlink .item { display: block; }

HTML:

<a href="..." class="hoverlink">
  <span class="item">Line 1</span>
  <span class="item">Line 2</span>
  <span class="item">Line 3</span>
</a>

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

-121--4716575-

Как правило, использование контейнеров STL таким образом небезопасно. Для обеспечения безопасности потока кода необходимо внедрить конкретный метод. Выбор решения зависит от ваших потребностей. Я бы, наверное, решил это, сохранив два списка, по одному в каждом потоке. И передача изменений через блокирующую свободную очередь (упомянутую в комментариях к этому вопросу). Можно также ограничить время жизни объектов Info, заключив их в boost::shared_ptr, например,

typedef boost::shared_ptr<Info> InfoReference; 
typedef std::list<InfoReference> InfoList;

enum CommandValue
{
    Insert,
    Delete
}

struct Command
{
    CommandValue operation;
    InfoReference reference;
}

typedef LockFreeQueue<Command> CommandQueue;

class Thread1
{
    Thread1(CommandQueue queue) : m_commands(queue) {}
    void run()
    {
        while (!finished)
        {
            //Process Items and use 
            // deleteInfo() or addInfo()
        };

    }

    void deleteInfo(InfoReference reference)
    {
        Command command;
        command.operation = Delete;
        command.reference = reference;
        m_commands.produce(command);
    }

    void addInfo(InfoReference reference)
    {
        Command command;
        command.operation = Insert;
        command.reference = reference;
        m_commands.produce(command);
    }
}

private:
    CommandQueue& m_commands;
    InfoList m_infoList;
}   

class Thread2
{
    Thread2(CommandQueue queue) : m_commands(queue) {}

    void run()
    {
        while(!finished)
        {
            processQueue();
            processList();
        }   
    }

    void processQueue()
    {
        Command command;
        while (m_commands.consume(command))
        {
            switch(command.operation)
            {
                case Insert:
                    m_infoList.push_back(command.reference);
                    break;
                case Delete:
                    m_infoList.remove(command.reference);
                    break;
            }
        }
    }

    void processList()
    {
        // Iterate over m_infoList
    }

private:
    CommandQueue& m_commands;
    InfoList m_infoList;
}   


void main()
{
CommandQueue commands;

Thread1 thread1(commands);
Thread2 thread2(commands);

thread1.start();
thread2.start();

waitforTermination();

}

Это не было скомпилировано. Необходимо обеспечить безопасность доступа к объектам Info .

-121--3119897-

Это измененная версия другого ответа, который я написал на ту же тему. До версии 3.

Основной проблемой является конфликт имен, так как если в коде есть переменная с именем count и вы используете пространство имен std; это будет неоднозначно относительно того, что вы имеете в виду. Это не просто число . Также будут включены обратные и равные , которые являются общими идентификаторами. Например, это приведет к ошибке компиляции:

#include <algorithm>
using namespace std;

int count;
int main(int argc, char* argv[]){
    count = 1;
}

Игнорирование всех проблем компилятора, это также проблема для любого, кто придет прочитать ваш код. Эти дополнительные 5 символов гарантируют, что следующий пользователь, поддерживающий ваш код, точно знает, что вы имеете в виду, не проверяя верхнюю часть файла каждую другую строку, чтобы узнать, имеете ли вы в виду std:: Последовательность или mylib:: Последовательность при записи последовательностей


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

(From Effective C++) В большинстве случаев очень выгодно использовать

using std::swap

Как и при наличии специализированной версии свопа, компилятор будет использовать это, в противном случае он обратится к std:: swap . При вызове std:: swap всегда используется базовая версия, которая не вызывает специализированную версию (даже если она существует).

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


В итоге,

  • Всегда предпочитайте использование std:: swap по сравнению с std:: swap ()

  • Избегайте использования пространства имен std в заголовке любой ценой из-за распространения, старайтесь избегать его использования в файлах реализации.

  • Наличие тысяч с использованием std:: foo в верхней части каждого файла - это не путь. В большинстве случаев используется для часто используемых классов.

Все остальное - это мнение.

4
ответ дан 10 December 2019 в 02:47
поделиться
Использование

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

-121--4321216-

Я думаю, что ваш выбор, вероятно, будет зависеть от того, сколько вызовов API вы намерены сделать в день. Ежедневный лимит бесплатного API Google Maps составляет 15 000 запросов на один IP-адрес. (Источник: Часто задаваемые вопросы по API-интерфейсу Google Maps .)

Геокодирование можно выполнить с помощью API-интерфейса Google Maps с помощью следующего HTTP-запроса:

Простой CSV:

http://maps.google.com/maps/geo?q=W1A+1AA,+London&output=csv&sensor=false

Более сложный XML:

http://maps.google.com/maps/geo?q=W1A+1AA,+London&output=xml&sensor=false

Просто измените параметр «q» с почтовым кодом и страной на геокод.

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

-121--2975593-

Лично я предпочитаю использование объявления , а не использование директивы .

Например:

#include<string>
using std::string;

string x="abc";

Использование директивы с помощью приводит все пространство имен в область, что может привести к проблемам со столкновением имен.

Для получения дополнительной информации см. this (настоятельно рекомендуется).

3
ответ дан 10 December 2019 в 02:47
поделиться

IE 6 поддерживает только псевдокласс : hover на ссылки, но IE 7 поддерживает его на большинстве элементов.

Как сказал Дэвид, это может не работать в режиме причуд. Тогда причиной будет то, что IE в основном возвращается к чему-то ближе к IE 4 в режиме причуд, позволяя много специфичных для IE функций и удаляя несколько совместимых со стандартами функций.

Если требуется функция : наведение на элемент блока и поддержка обратно в IE 6, можно использовать элемент ссылки и сделать его элементом блока с помощью CSS. Обратите внимание, что ссылка может содержать только встроенные элементы (например, no div s), так что если вы хотите блокировать элементы внутри ссылки, вам придется установить, что с помощью CSS также:

CSS:

.hoverlink { display: block; }
.hoverlink:hover { background: #eee; }
.hoverlink .item { display: block; }

HTML:

<a href="..." class="hoverlink">
  <span class="item">Line 1</span>
  <span class="item">Line 2</span>
  <span class="item">Line 3</span>
</a>

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

-121--4716575-

Как правило, использование контейнеров STL таким образом небезопасно. Для обеспечения безопасности потока кода необходимо внедрить конкретный метод. Выбор решения зависит от ваших потребностей. Я бы, наверное, решил это, сохранив два списка, по одному в каждом потоке. И передача изменений через блокирующую свободную очередь (упомянутую в комментариях к этому вопросу). Можно также ограничить время жизни объектов Info, заключив их в boost::shared_ptr, например,

typedef boost::shared_ptr<Info> InfoReference; 
typedef std::list<InfoReference> InfoList;

enum CommandValue
{
    Insert,
    Delete
}

struct Command
{
    CommandValue operation;
    InfoReference reference;
}

typedef LockFreeQueue<Command> CommandQueue;

class Thread1
{
    Thread1(CommandQueue queue) : m_commands(queue) {}
    void run()
    {
        while (!finished)
        {
            //Process Items and use 
            // deleteInfo() or addInfo()
        };

    }

    void deleteInfo(InfoReference reference)
    {
        Command command;
        command.operation = Delete;
        command.reference = reference;
        m_commands.produce(command);
    }

    void addInfo(InfoReference reference)
    {
        Command command;
        command.operation = Insert;
        command.reference = reference;
        m_commands.produce(command);
    }
}

private:
    CommandQueue& m_commands;
    InfoList m_infoList;
}   

class Thread2
{
    Thread2(CommandQueue queue) : m_commands(queue) {}

    void run()
    {
        while(!finished)
        {
            processQueue();
            processList();
        }   
    }

    void processQueue()
    {
        Command command;
        while (m_commands.consume(command))
        {
            switch(command.operation)
            {
                case Insert:
                    m_infoList.push_back(command.reference);
                    break;
                case Delete:
                    m_infoList.remove(command.reference);
                    break;
            }
        }
    }

    void processList()
    {
        // Iterate over m_infoList
    }

private:
    CommandQueue& m_commands;
    InfoList m_infoList;
}   


void main()
{
CommandQueue commands;

Thread1 thread1(commands);
Thread2 thread2(commands);

thread1.start();
thread2.start();

waitforTermination();

}

Это не было скомпилировано. Необходимо обеспечить безопасность доступа к объектам Info .

Использование -121--3119897-

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

2
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

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