я пытаюсь реализовать массив в моем c ++ моделировании (эта кодировка должна иметь 2 значения в одном поле сетевого пакета)
это мое объявление переменной (в заголовке)
Ptr<Name> m_names [2];
это объявление моей функции (в шапке)
void SetName (unsigned which, Ptr<Name> name);
void SetName (unsigned which, const Name &name);
в исходном файле
void Interest::SetName (unsigned which, Ptr<Name> name)
{
if (which < 2)
{
m_names[which] = name;
}
}
void Interest::SetName (unsigned which, const Name &name)
{
if (which < 2)
{
m_names[which] = Create<Name> (name);
}
}
Вот как я это называю (в моем основном файле):
interest->SetName (0, nameWithSequence);
interest->SetName (1, nameWithNextSequence);
в результате это дает ошибку, как это
src/ndnSIM/bindings/ns3module.cc: In function ‘PyObject* _wrap_PyNs3NdnData_SetName__0(PyNs3NdnData*, PyObject*, PyObject*, PyObject**)’:
src/ndnSIM/bindings/ns3module.cc:8418:62: error: no matching function for call to ‘ns3::ndn::Data::SetName(ns3::Ptr<ns3::ndn::Name>)’
src/ndnSIM/bindings/ns3module.cc:8418:62: note: candidates are:
./ns3/ndn-data.h:60:3: note: void ns3::ndn::Data::SetName(unsigned int, ns3::Ptr<ns3::ndn::Name>)
./ns3/ndn-data.h:60:3: note: candidate expects 2 arguments, 1 provided
вопрос в том, как правильно я должен объявить правильное утверждение. Ценю любую помощь
РЕДАКТИРОВАТЬ
Я нашел некоторые из определения pyhton, чтобы связать мой код C ++ (SetName)
def __setattr__(self, name, value):
if name == "_interest":
return object.__setattr__ (self, name, value)
elif name == "name":
if value is None:
return self._interest.SetName (ns.ndnSIM.ndn.Name ())
elif isinstance (value, Name):
return self._interest.SetName (value._name)
elif isinstance (value, ns.ndnSIM.ndn.Name):
return self._interest.SetName (value)
elif isinstance (value, str):
return self._interest.SetName (ns.ndnSIM.ndn.Name (value))
else:
raise ValueError ("Invalid name parameter")
Как и как правильно решить эту проблему. Спасибо
Хорошо, позвольте мне привести вам пример.
Я предполагаю Ptr
действует что-то вроде std::shared_pointer
, а также Name
как std::string
(по крайней мере, для примера).
Прежде всего, я бы порекомендовал использовать std::array
вместо массива в стиле c. Но это не совсем необходимо.
Во-вторых. Если вы планируете m_names
чтобы быть массивом размера fidex, вы можете выдать исключение при доступе к несуществующему члену.
Вот код
Заголовок (test.h):
#include <string>
#include <memory>
#include <array>
typedef std::shared_ptr<std::string> pString;
struct A{
protected:
static constexpr size_t array_size = 2;
std::array<pString, array_size> m_names;
static void CheckRange(size_t);
public:
void SetName(size_t id, const std::string& name);
void SetName(size_t id, const pString& name);
const std::string& GetName(size_t id) const;
const pString& GetNamePtr(size_t id) const;
};
Источник:
#include "test.h"#include <exception>
void A::SetName(size_t id, const pString &name){
CheckRange(id);
m_names[id] = name;
}
void A::SetName(size_t id, const std::string& name){
CheckRange(id);
m_names[id] = std::make_shared<std::string>(name);
}
const std::string& A::GetName(size_t id) const{
CheckRange(id);
if (!m_names[id])
throw std::logic_error("Pointer is not initialized");
return *(m_names[id].get());
}
const pString& A::GetNamePtr(size_t id) const {
CheckRange(id);
return m_names[id];
}
И вот пример CheckRange
функция:
void A::CheckRange(size_t id){
if (!(id < array_size))
throw std::logic_error("ID should be < " +
std::to_string(array_size));
}
Этот код с некоторыми тестами: http://ideone.com/rUvVhH
if (m_names[id])
проверяет, если m_names[id]
содержит действительный указатель (например, не nullptr
). Я полагаю Ptr
имеет схожий функционал.
И я верю std::make_shared<T>(...)
похож на Create<T>(...)
,
Ну, а для меня это более-менее правильный способ получения содержимого массива 🙂
Если что-то будет слишком сложным, я постараюсь облегчить понимание.
Вы можете задать, если у вас есть какие-либо вопросы!
Ошибка во время компиляции в коде привязки Python. Так,
Если вы написали код привязки (оболочки) самостоятельно (используя Python C API или boost :: python), вы должны найти, где вы определяете привязку SetName, в нем отсутствует параметр.
Если привязка автоматически генерируется каким-либо инструментом (например, SWIG или SIP), вы должны найти, где определена привязка SetName: это то, что инструмент-обертка будет использовать, чтобы выяснить, какой код генерировать, ошибка в этом определении.
Код Python, который вы добавили в свой пост, SetAttr, ясно указывает, что вызовы self._interest.SetName (obj) неверны: ваш C ++ показывает, что SetName принимает два параметра. Если SetAttr генерируется каким-то инструментом (ns3?), вы должны выяснить, как он это делает, чтобы дать ему правильное определение SetName, чтобы SetAttr будет иметь правильный звонок.