Я думаю, что это более подходит
class Maker
{
public $array = [];
function set($key, $value = [])
{
$this->array[$key] = $value;
}
}
$maker = new Maker();
$maker->set('a', array( 'VAL1', 1 ));
$maker->set('b', array( 'VAL1', array ( 'VAL2', 2 ) ));
$maker->set('c' , array( 'VAL1', array ( 'VAL2', array ( 'VAL3', 3 ) ) ));
var_dump($maker->array);
В заголовочном файле необходимо включать ВСЕ заголовки для создания этого компилируемым. И не забывайте использовать предописания вместо некоторых заголовков.
В исходном файле:
В том порядке Вы не пропустите ни одного из своих заголовочных файлов, которые забыли включать библиотеки их собственным.
Хорошая практика: каждый.h файл должен иметь .cpp, который включает это.h сначала перед чем-либо еще. Это доказывает, что любой.h файл может быть помещен сначала.
Даже если заголовок не требует никакой реализации, Вы делаете .cpp, который просто включает это.h файл и ничто иное.
Это затем означает, что можно ответить вопрос любым путем, Вам нравится. Не имеет значения, что приказывает, чтобы Вы включали их в.
Для дальнейших больших подсказок попробуйте эту книгу: крупномасштабная Разработка программного обеспечения C++ - это - позор, это настолько дорого, но это - практически практические советы для освоения системы для расположения исходного кода C++.
В заголовочных файлах я склонен помещать стандартные заголовки сначала, затем мои собственные заголовки (оба списка, заказываемые в алфавитном порядке). В файлах реализации я поместил сначала соответствующий заголовок (если таковые имеются), затем заголовки стандартов и другие заголовки зависимости.
Порядок имеет мало значения, кроме того, если Вы делаете большое использование макросов и #define
; в этом случае Вы должны проверенный, который макрос, который Вы определили, не заменяет ранее включенный один (кроме того, если это - то, что Вы хотите, конечно).
Относительно этого оператора
те, которые требуются последующими заголовками, должны быть ранее
Заголовок не должен полагаться на другие заголовки, включаемые перед ним! Если это требует заголовков, это просто включает их. Защита заголовка предотвратит несколько включение:
#ifndef FOO_HEADER_H
#define FOO_HEADER_H
...
#endif
Править
Так как я записал этот ответ, я изменил свой способ заказать включать директивы в моем коде. Теперь, я пытаюсь всегда поместить заголовки в увеличивающийся порядок стандартизации, таким образом, заголовки моего проекта на первом месте, сопровождаемые сторонними заголовками библиотек, сопровождаемыми стандартными заголовками.
Например, если один из моего файла пользуется библиотекой, я записал, QT, Повышение и стандартная библиотека, я закажу включение следующим образом:
//foo.cpp
#include "foo.hpp"
#include <my_library.hpp>
// other headers related to my_library
#include <QtCore/qalgorithms.h>
// other Qt headers
#include <boost/format.hpp> // Boost is arguably more standard than Qt
// other boost headers
#include <algorithms>
// other standard algorithms
Причина, почему я делаю, который должен обнаружить недостающие зависимости в моих собственных заголовках: давайте примем, например, это my_library.hpp
использование std::copy
, но не включает <algorithm>
. Если я включаю его после <algorithm>
в foo.cpp
, эта недостающая зависимость останется незамеченной. Наоборот, с порядком я просто представил, компилятор будет жаловаться это std::copy
не был объявлен, позволив мне исправить my_library.hpp
.
В каждой группе "библиотеки" я пытаюсь сохранить включать директивы заказанными в алфавитном порядке, найти их более легко.
На заметке на полях хорошая практика должна также ограничить в максимуме зависимость между заголовочными файлами. Файлы должны включать как можно меньше заголовков, особенно файл заголовков. Действительно, чем больше заголовков Вы включаете, тем больше кода должно быть перекомпилировано, когда что-то изменяется. Хороший способ ограничить эти зависимости состоит в том, чтобы использовать предописание, которое очень часто достаточно в заголовочных файлах (см., Когда я могу использовать предописание?).
Google руководство по стилю C++, имена и порядок включает:
В dir/foo.cc, основная цель которого состоит в том, чтобы реализовать или протестировать материал в dir2/foo2.h, заказать Ваш, включает следующим образом:
- dir2/foo2.h (предпочтенное местоположение — посмотрите детали ниже).
- C системные файлы.
- Системные файлы C++.
- .h файлы других библиотек.
- .h файлы Вашего проекта.
Я раньше заказывал им в алфавитном порядке (легче найти)
"Как" не очевидно, но, "какой". Ваша цель состоит в том, чтобы удостовериться, что порядок, в который Вы включаете заголовочные файлы, никогда не имеет значения (и я имею в виду "НИКОГДА!").
Хорошая справка должна протестировать, компилируют ли заголовочные файлы при создании cpp файлов (один для каждого заголовочного файла), которые только включают одного из них.
Для .cpp файлов необходимо включать заголовок класса или независимо от того, что Вы реализуете сначала, таким образом, Вы ловите случай, где этот заголовок отсутствует, некоторые включают. После этого большинство инструкций по кодированию имеет тенденцию включать системные заголовки сначала, вторые заголовки проекта, например, Google Руководство по стилю C++.
Это - вещь зависимости, и это зависит в основном от того, что Вы вставляете наши заголовки. Факт - то, что можно быть действительно известными об этом и минимизировать для хранения Вашего, включает строгий, но Вы в конечном счете столкнетесь со сценарием, где Вы будете хотеть использовать защиту включения.
#ifndef MY_HEADER_H
#define MY_HEADER_H
//...
#endif
Проблема не настолько очевидна в начале, но поскольку сложность Вашего программного обеспечения растет так делает Ваши зависимости. Можно преуспеть и быть умными об этом, но большие проекты C++ обычно пронизываются, включает. Можно попробовать, но можно только сделать так много. Так будьте прилежны и думайте о Вашем, включает, ДА! Но у Вас несомненно будут циклические зависимости в какой-то момент, и именно поэтому Вам нужна защита включения.
Если для заголовка нужны другие заголовки затем, он просто включает их в тот заголовок.
Попытайтесь структурировать свой код, таким образом, Вы передаете указатели или ссылки и вперед объявляете, где Вы можете.
В реализации затем заголовок, который определяет его, должен быть перечислен сначала (кроме Visual Studio при использовании pch затем stdafx, пошел бы сначала).
Я обычно перечисляю их, поскольку мне нужно.
Я нашел следующую конвенцию самым полезным:
module.cpp:
// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h>
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project
Важная вещь состоит в том, чтобы поместить заголовок модуля как первый непредварительно скомпилированный заголовок. Это гарантирует, что "module.h" не имеет никаких неожиданных зависимостей.
Если Вы работаете над крупным проектом с медленными временами доступа к диску, я видел, что этот стиль раньше уменьшал время изготовления:
module.cpp:
// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h>
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project
#if !defined _OTHER_MODULE_GUARD_
#include "other_module.h"
#endif
#if !defined _ANOTHER_MODULE_GUARD_
#include "another_module.h"
#endif
Это является немного подробным, но действительно экономит на диске, ища, так как заголовок не будет разыскиваться / открытый, если это было уже включено. Без защитной проверки компилятор будет искать и открывать заголовочный файл, анализировать целый файл для окончания #ifdef
луг целый файл.