访问由引用对象传递的引用对象传递的变量

时间:2017-03-23 02:44:18

标签: c++ pass-by-reference

我花了一段时间思考如何提出这个问题。代码太大了,所以我会尝试只考虑重要的部分。

    class full_object_detection
{
public:
    full_object_detection(
        const rectangle& rect_,
        const std::vector<point>& parts_
    ) : rect(rect_), parts(parts_) {}

    full_object_detection(){}

    explicit full_object_detection(
        const rectangle& rect_
    ) : rect(rect_) {}

    const rectangle& get_rect() const { return rect; }
    rectangle& get_rect() { return rect; }
    unsigned long num_parts() const { return parts.size(); }

    const point& part(unsigned long idx) const 
    { 
        // make sure requires clause is not broken
        DLIB_ASSERT(idx < num_parts(),
            "\t point full_object_detection::part()"
            << "\n\t Invalid inputs were given to this function "
            << "\n\t idx:         " << idx  
            << "\n\t num_parts(): " << num_parts()  
            << "\n\t this:        " << this
            );
        return parts[idx]; 
    }

    point& part(unsigned long idx)  { 
        // make sure requires clause is not broken
        DLIB_ASSERT(idx < num_parts(),
            "\t point full_object_detection::part()"
            << "\n\t Invalid inputs were given to this function "
            << "\n\t idx:         " << idx  
            << "\n\t num_parts(): " << num_parts()  
            << "\n\t this:        " << this
            );
        return parts[idx]; 
    }

    friend void serialize (
        const full_object_detection& item,
        std::ostream& out
    )
    {
        int version = 1;
        serialize(version, out);
        serialize(item.rect, out);
        serialize(item.parts, out);
    }

    friend void deserialize (
        full_object_detection& item,
        std::istream& in
    )
    {
        int version = 0;
        deserialize(version, in);
        if (version != 1)
            throw serialization_error("Unexpected version encountered while deserializing dlib::full_object_detection.");

        deserialize(item.rect, in);
        deserialize(item.parts, in);
    }

    bool operator==(
        const full_object_detection& rhs
    ) const
    {
        if (rect != rhs.rect)
            return false;
        if (parts.size() != rhs.parts.size())
            return false;
        for (size_t i = 0; i < parts.size(); ++i)
        {
            if (parts[i] != rhs.parts[i])
                return false;
        }
        return true;
    }

private:
    rectangle rect;
    std::vector<point> parts;  
};
typedef vector<long,2> point;
const full_object_detection& d = dets[i]; //Passed by reference object

输出:

cout << d.part(41) << endl; // (123,456)

cout << d.part(41).x << endl; // ERROR!

Error   C3867   'dlib::vector<long,2>::x': non-standard syntax; use '&' to create a pointer to member

Error   C2679   binary '<<': no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion)

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Looking at this compiler error more generally,似乎point::x()实际上是成员函数,而不是变量。所以你应该使用

cout << d.part(41).x() << endl; // :)

为什么这个错误如此神秘? obj.func可以被视为尝试将函数用作函数指针变量(例如&T::func)。因此,您会看到编译器错误:

  1. 不知道如何打印(使用operator<<)方法。更糟糕的是,这是一种覆盖方法,因此它的名称含糊不清。
  2. 使用object.MethodName是非标准的。