1

我试图在我的 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")

如何以及解决此问题的正确方法是什么。谢谢

4

2 回答 2

0

错误出现在 Python 绑定代码的编译时。所以,

  1. 如果您自己编写了绑定(包装器)代码(使用 Python C API 或 boost::python),您必须找到定义 SetName 绑定的位置,它缺少一个参数。

  2. 如果绑定是由某些工具(如 SWIG 或 SIP)自动生成的,您必须找到 SetName 绑定的定义位置:这是包装工具用来确定要生成什么代码的内容,错误在该定义中。

您添加到帖子中的 Python 代码setattr清楚地表明 self._interest.SetName(obj) 调用是错误的:您的 C++ 显示 SetName 采用两个参数。如果setattr是由某个工具(ns3?)生成的,您必须找到它是如何做到这一点的,以便为其提供正确的 SetName 定义,以便setattr能够正确调用。

于 2014-01-24T14:50:59.620 回答
0

好吧..让我给你举个例子。我假设Ptr行为类似于std::shared_pointer和(至少出于示例目的)。Namestd::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]包含有效指针(例如 not nullptr)。我想Ptr有一些类似的功能。和我相信std::make_shared<T>(...)是类似的Create<T>(...)

好吧,就我而言,这或多或少是检索数组内容的正确方法:)
如果某些事情太复杂,我会尽量让它更容易理解。
有什么问题欢迎提问!

于 2014-01-22T07:40:21.843 回答